【问题标题】:Classpath is set, but still getting NoClassDefFoundError类路径已设置,但仍收到 NoClassDefFoundError
【发布时间】:2012-06-04 05:04:34
【问题描述】:

我正在尝试将一个非常简单的应用程序打包到一个 jar 中以分发给用户。我在 Mac OS X 10.6.8 上使用 Eclipse Indigo 和 m2e 插件。

我使用 Maven build: package 目标将其打包为 jar。如果我双击 jar 将其打开,GUI 会打开并且似乎正在工作,但是当我单击执行按钮时,什么也没有发生。 (如果我在 Eclipse 中运行为...,则程序运行良好)。

如果我尝试从命令行运行 jar,它甚至不会打开 GUI,我会收到以下错误:

Exception in thread "main" java.lang.NoClassDefFoundError: str-profile-comparison-0/0/1-SNAPSHOT    /jar
Caused by: java.lang.ClassNotFoundException: str-profile-comparison-0.0.1-SNAPSHOT.jar
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

我从 jar 中提取清单文件,检查类路径,它看起来像这样:

Manifest-Version: 1.0
Built-By: username
Build-Jdk: 1.6.0_24
Class-Path: poi-3.7.jar poi-ooxml-3.7.jar poi-examples-3.7.jar xmlbean
s-2.3.0.jar stax-api-1.0.1.jar dom4j-1.6.1.jar xml-apis-1.0.b2.jar po
i-ooxml-schemas-3.7.jar geronimo-stax-api_1.0_spec-1.0.jar poi-scratc
hpad-3.7.jar junit-4.8.2.jar
Created-By: Apache Maven
Main-Class: com.{companyname}.strprofilecomparison.logic.StrComparatorGUI
key: value
url:
mode: development
Archiver-Version: Plexus Archiver

我对这里发生的事情有几个问题:

  1. 为什么双击 jar 文件时 GUI 会打开,但在命令行中尝试运行时却没有?

  2. 我猜类路径需要定义我正在使用的外部 jar 的绝对路径,如何在 POM 文件中设置它?

【问题讨论】:

  • 对于1,我不记得双击是否使用javaw而不是java.exe。此外,如果您的系统中有多个 jre,则双击可能会加载一个版本,而命令行可能会加载另一个版本。你需要检查一下。
  • 我刚刚意识到它是 mac osx 版本。不过,从双击、命令行或聚光灯启动时可能会应用不同的路径。
  • 对于 2,你可以尝试 maven 程序集,它将所有依赖项包含在一个大 jar 文件中。 maven.apache.org/plugins/maven-assembly-plugin
  • 清单中的类路径条目是相对的,而不是绝对的。它所说的未找到的类实际上是一个 JAR 文件。您是否曾在某处使用 JAR 文件名作为类名?
  • 太好了,感谢您提供的所有出色答案。还有一个问题,如果我使用 maven-assembly-plugin,我是否使用它来代替 maven-jar-plugin?这意味着我不再需要 maven-jar-plugin 了吗?

标签: java maven jar classpath


【解决方案1】:

该清单表明您所有的依赖项都位于与您的 jar 相同的目录中。如果这不是真的,那就别去了。

就个人而言,我会使用 appassembler 插件来制作具有 shell 脚本来启动它的设备。或者阴影插件来制作一个只包含它们的 uberjar。或者了解 OSX 存根以制作适合 OSX 的 .app 应用程序。

【讨论】:

    猜你喜欢
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2017-03-21
    • 2018-01-22
    • 2015-11-12
    • 2014-11-29
    相关资源
    最近更新 更多