当前位置: 首页 > 面试题库 >

当我的JAR位于类路径上时,为什么Ant会说“ NoClassDefFound”?

柏麒
2023-03-14
问题内容

我正在使用Java 1.6,Eclipse和Ant。

以下是我创建和运行jar文件的目标:

    <!-- Settings -->
    <property file="build.properties" />
    <path id="classpath">
        <fileset dir="${lib.dir}" includes="**/*.jar" />
    </path>

    <!-- Compile -->
    <target name="compile">
        <mkdir dir="${classes.dir}" />
        <javac srcdir="${src.dir}" destdir="${classes.dir}" includeantruntime="false">
            <classpath refid="classpath" />
        </javac>
    </target>

    <!-- Package .jar -->
    <target name="jar">
        <mkdir dir="${jar.dir}" />
        <jar destfile="${jar.dir}/App.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="main.App" />
            </manifest>
        </jar>
    </target>

    <!-- Run .jar -->
    <target name="run">
        <java jar="${jar.dir}/App.jar" fork="true" />
    </target>

问题是,当我(通过Ant或命令行)运行此jar时,收到错误消息:

Exception in thread "main" java.lang.NoClassDefFoundError: net/xeoh/plugins/base/impl/PluginManagerFactory
     [java]     at plugins.PluginLoader.<clinit>(Unknown Source)

一些可能有用的知识:

  • 当我打印我的类路径时,它表明所有必需的JAR都在其中。它还显示了类路径的Eclipse GUI版本。

  • 我尝试清理项目(通过Eclipse和Ant)都无济于事。

  • 似乎缺少的库.jar 不是 .jar中的.jar(这似乎是一个常见问题)。

  • 这是唯一的错误。其他班级似乎都觉得图书馆不错…


问题答案:

您已经设置了编译类路径,但是App.jar不包括您的库(仅包含您编译的类)或清单类路径。

您需要执行以下操作:

<target name="jar">
    <mkdir dir="${jar.dir}" />
    <manifestclasspath property="manifest.classpath"
                       jarfile="${jar.dir}/App.jar">
      <classpath refid="classpath" />
    </manifestclasspath>
    <jar destfile="${jar.dir}/App.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="main.App" />
            <attribute name="Class-Path" value="${manifest.classpath}" />.
        </manifest>
    </jar>
</target>

另请参见ant
manifestclasspath任务



 类似资料:
  • 问题内容: 我试图在一些使用ant脚本的旧项目上进行“干净的专家”设置。我对蚂蚁知之甚少,所以我的问题似乎很幼稚。 我快完成了,但是由于classpath中的冗余,所以传递ant脚本失败了。如果我了解构建,则这些行应将“提供”范围内的每个库添加到类路径中: 然后这个: 将那些依赖项添加到ant.home目录中的库中。 麻烦的是,我使用的maven pom依赖于我无法修改的父pom,因此,我的类路径

  • 由于未触发SleuthKafkaAspect.WrapProducerFactory()方法,跟踪信息不会通过kafka消息传播。在生产者端,消息被正确发送,跟踪信息被正确记录。在消费者端,将创建一个新的traceId和spanId。 以下两个日志记录行显示了traceId、spanId(和parentId)的不同值: 首先,使用Krafdrop和调试,我验证了消息头不包含任何跟踪信息。 之后,我

  • 问题内容: 想知道不指定classpath选项时默认的classpath是什么吗? 问题答案: 当前的工作目录()。 从Java™教程中:PATH和CLASSPATH: 类路径 的 默认值为“。” ,表示仅搜索当前目录。指定CLASSPATH变量或-cp命令行开关将覆盖此值。 这包括子目录吗? 不,在类路径中没有条目是“递归的”。您必须明确列出每个子目录(或jar)。但是,如果您有一个表示clas

  • 反应路由路径不工作 它在所有URL中仅显示产品组件 我已经灌输了react路由器dom,还导入了BrowserRouter作为路由器、交换机、路由、链路 到底是什么问题?我想不出来。

  • 使用Linux;应用程序目录为: java-classpath/home/momy/a1/specter src.spectermain.mainclass 我得到这个错误:错误:无法找到或加载主类src.spectersafemain.MainClass 在netbeans上,该应用程序工作得很好…。我将应用程序重新打包到。exe版本,.exe开始工作,但DB not work显示derby j

  • 我一直在使用NetBeans为我做所有的编译/类路径工作,但是我想试一试: 下面是我在命令提示符中输入的内容 有人能指出为什么java找不到这个类吗?我该如何帮助它找到这个类 我在oracle文档中读到,我的类路径应该设置为主包。我的类在一个名为path的包中: 桌面 路径根据要求直接从记事本下载java: