首页 > 解决方案 > 使用 jar-in-jar 加载程序时出现 NoClassDefFoundError

问题描述

我有一个 Eclipse 项目,我使用 Ant 构建将其导出到可运行的 jar,并使用 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: .

标签: javaantexecutable-jarnoclassdeffounderror

解决方案


问题

可能您的文件jar-in-jar-loader.zip已过时并且不适合 Java >= 9,我遇到了同样的问题。

解决方案

要获取该文件的最新版本,请右键单击您的项目 -> 导出 -> 可运行的 JAR 文件 -> 选中“另存为 ANT 脚本” -> 完成。这将jar-in-jar-loader.zip在您的项目目录中创建最新版本的 。ant-script 本身不需要调整,至少在我的情况下是这样。


推荐阅读