【问题标题】:Not able to execute jar file. Getting NoClassDefFoundError无法执行 jar 文件。获取 NoClassDefFoundError
【发布时间】:2013-09-09 03:03:08
【问题描述】:

我已经使用 build.jar 创建了一个可执行的 jar 文件。

<target name="deploy" depends="compile">
<jar jarfile="${deploy.home}/${app.name}.jar" basedir="${build.home}">
<manifest>
<attribute name="Main-Class" value="abc.xyz"/>
</manifest>
</jar>

这里的xyz调用有执行整个程序的main方法..

public static void main(String[] args) {
        File buildFile = new File("build.xml");
        Project p = new Project();
        p.setUserProperty("ant.file", buildFile.getAbsolutePath());
        p.init();
        ProjectHelper helper = ProjectHelper.getProjectHelper();
        p.addReference("ant.projectHelper", helper);
        helper.parse(p, buildFile);
        p.executeTarget(p.getDefaultTarget());
} 

jar 文件创建成功。当我执行java -jar appname.jar 之类时,它会抛出异常——

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/tools/ant/Project
        at abc.xyz.main(xyz.java:20)
Caused by: java.lang.ClassNotFoundException: org.apache.tools.ant.Project
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)

找不到项目类。它在ant.jar 中。

但是当我通过命令提示符 java abc 执行 abc.java 类时,它工作正常。

很高兴帮助我找到原因?及其解决方案。

【问题讨论】:

  • 你能解释一下But when i execute the xyz.java class simply by on command prompt java abc.java its working fine你有两个班吗?一个打电话给对方?你能把这两个类的全部代码贴出来吗(省略不感兴趣的部分)我需要检查你的包声明
  • 您必须将所需的库添加到 app-jar 清单中声明的​​类路径中。如果您的应用程序需要 ant.jar,您必须告诉 Java。
  • 感谢 Gianmarco,这是拼写错误,我已编辑,它只有一个主类。没有包裹问题。它在 Eclipse 上工作正常。
  • 感谢@Holger。我了解它正在寻找项目类,但是在编译和创建 jar 时,我提供了所有 req jar 引用。然后在我的项目中,如果我在编译时使用了 200 个 jar。我需要提供 200 个罐子的参考资料吗?我有点困惑。请建议..
  • @Holger -- 您能否告诉我如何将所需的库添加到您的 app-jar 清单中声明的​​类路径中?

标签: java ant jar executable-jar


【解决方案1】:

将所需的库添加到 jar 的类路径中

<target name="deploy" depends="compile">
<jar jarfile="${deploy.home}/${app.name}.jar" basedir="${build.home}">
<manifest>
<attribute name="Main-Class" value="abc.xyz"/>
<attribute name="Class-Path" value="ant.jar"/>
</manifest>
</jar>

如果您需要多个罐子,则必须用空格分隔它们。

【讨论】:

  • 路径应该相对于包含清单的应用程序 jar 的位置。所以你应该知道你要部署的目录结构。如果您打算部署应用程序以便它可以在不同的环境下运行,则应始终避免使用绝对路径。
  • Holger- 你真好。但很抱歉它没有帮助我。还是一样的错误。但是在清单文件中我可以看到类是相对添加的。我需要在 app.jar 中包含 lib 文件夹吗?感谢您的帮助..
  • 没有引用的库必须相对于 app.jar 不在其中。
  • 必须是与您的问题和 cmets 中未包含的信息相关的内容。您可以尝试将所有 jar 放入同一目录,并将类路径设置为 jar 名称,不带任何路径前缀。
  • 我已经添加了路径,现在我收到了这个错误——线程“main”中的异常无法加载版本信息。在 org.apache.tools.ant.Main.getAntVersion(Main.java:956) 在 org.apache.tools.ant.Project.initProperties(Project.java:308) 在 org.apache.tools.ant.Project.init (Project.java:295).. 请帮忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多