问题描述
我有一个使用Ant构建导出到可运行JAR的Eclipse项目,并且我使用JAR-in-JAR加载器将一些JAR库放入项目JAR中。这曾经是可行的,在我的记忆中,更新到Java 9是破坏它的原因。我可能错了,但我只是用了我的罐子一段时间,直到它停止工作。
在Eclipse中运行项目很好,但当我使用JAR并调用其中一个库中的方法时,我得到一个NoClassDefFoundError。不管是哪个库。
java.lang.NoClassDefFoundError: myutils/MyUtils at packagename.Utils.input(Utils.java:42) at packagename.Main.main(Main.java:83) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) Caused by: java.lang.ClassNotFoundException: myutils.MyUtils at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:436) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 7 more
以下是Ant版本:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <project default="create_run_jar" name="Create Runnable Jar for Project ProjectName with Jar-in-Jar Loader"> <!--this file was created by Eclipse Runnable JAR file Export Wizard--> <!--ANT 1.7 is required--> <!--define folder properties--> <property name="dir.buildfile" value="."/> <property name="dir.workspace" value="${dir.buildfile}/.."/> <property name="dir.libraries" value="${dir.buildfile}/../../libraries"/> <property name="dir.projectjars" value="${dir.buildfile}/../../project-jars"/> <target name="create_run_jar"> <jar destfile="${dir.projectjars}/jarname.jar"> <manifest> <attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/> <attribute name="Rsrc-Main-Class" value="packagename.Main"/> <attribute name="Class-Path" value="."/> <attribute name="Rsrc-Class-Path" value="./ guava-19.0.jar jsoup-1.9.1.jar myutils.jar"/> </manifest> <zipfileset src="jar-in-jar-loader.zip"/> <fileset dir="${dir.buildfile}/bin"/> <zipfileset dir="${dir.libraries}" includes="guava-19.0.jar"/> <zipfileset dir="${dir.libraries}" includes="jsoup-1.9.1.jar"/> <zipfileset dir="${dir.projectjars}" includes="myutils.jar"/> </jar> </target> </project>
编辑:以下是MANIFEST.MF:
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.10.5 Created-By: 12.0.2+10 (Oracle Corporation) Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader Rsrc-Main-Class: packagename.Main Rsrc-Class-Path: ./ guava-19.0.jar jsoup-1.9.1.jar myutils.jar Class-Path: .
推荐答案
问题
可能您的文件jar-in-jar-loader.zip已过时,不适合Java>;=9,我也遇到了同样的问题。
解决方案
要获取该文件的最新版本,请右键单击您的项目-&>导出-&>可运行的JAR文件--选中&>另存为Ant脚本--&>完成。这将在您的项目目录中创建jar-in-jar-loader.zip的最新版本。蚂蚁脚本本身不需要调整,至少在我的例子中是这样。