繁体   English   中英

使用自行创建的jar文件时出现ClassNotFoundException

[英]ClassNotFoundException when using a self-created jar file

使用Eclipse,我创建了一些解析器类,我希望将它们作为jar存档提供给另一个项目,以进行验证。 因此,解析器项目如下所示:

ParserProject
- src
-- com.package.x
--- ClassA
--- ClassB
- lib
-- external1.jar
-- external2.jar

ClassAClassB使用外部jar档案,例如Jackson或某些Apache Commons。 为了向另一个项目提供功能,我将整个项目导出为jar存档和可执行的jar存档( 右键单击项目> Export ...> Java> JAR文件>选择所有文件,然后“导出生成的类文件和资源”>完成 )。

创建的jar文件没有任何错误。 在验证项目中使用parserproject.jar时,可以使用自动完成功能访问所有方法,但是在运行验证项目时,会得到java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonParseException

现在有三件事:

  1. 所有杰克逊罐子都包含在解析器项目中。 此外,我可以在解析器项目中运行main()方法,并且一切正常,不会发生ClassNotFoundException

  2. 当我在类路径中将parserproject.jar添加到验证项目并在Package Explorer中打开jar存档时,parserproject.jar似乎包含了它所需的所有jar。

  3. 对于可执行jar存档,所有必需的外部jar都包含在MANIFEST.MF程序包浏览器>验证项目>引用的库> +,除了parserproject.jar> META-INF> MANIFEST.MF )。 看起来像这样:

清单版本:1.0 Rsrc类路径:./ json-20140107.jar jackson-annotations-2.5.4.jar ja ckson-core-2.5.4.jar jackson-databind-2.5.4.jar commons-io- 2.4.jar co mmons-validator-1.3.1.jar slf4j-api-1.7.5.jar slf4j-log4j12-1.7.5.jar json-schema-validator-2.2.6.jar jackson-module-jsonSchema-2.4。 4.jar juniversalchardet-1.0.3.jar snakeyaml-1.15.jar commons-beanutils-1.7。 0.jar commons-digester-1.6.jar commons-logging-1.0.4.jar joda-time-2。 8.1.jar jopt-simple-4.6.jar jsr305-3.0.0.jar json-schema-core-1.2.5.j ar libphonenumber-6.2.jar jackson-coreutils-1.8.jar commons-lang-2.6。 jar guava-16.0.1.jar msg-simple-1.1.jar btf-1.2.jar mailapi-1.4.3.jar uri-template-0.9.jar类路径:。 Rsrc主要类别:com.package.SchemeValidator主要类别:org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader

  1. 当且仅当我在验证项目中使用生成的jar文件时,我才会获得异常。 如果我摆脱了parserproject.jarparserproject.jar定义了对ecplise解析器项目的依赖关系( 右键单击验证项目>属性> Java构建路径>项目 ),则不会得到ClassNotFoundException

所以现在我的问题是,我应该如何导出jar,以便找到每个类。 谢谢!

Eclipse在生成.jar时仅照顾编译时的依赖性

由于您生成的.jar几乎可以移动到任何地方,因此在执行期间必须再次存在依赖项。

您有两种选择:

  1. 使用-jar选项执行jar,同时将所有依赖项保留在同一文件夹中。 由于清单使用“ ./”作为classpath ,这意味着所有依赖项都必须位于从中执行jar的同一目录中。 注意 classpath相对于您正在执行的目录,而不是文件所在的目录。
  2. 使用-jar选项执行jar,然后指定-cp选项以指向依赖项,并指定主类。

java -cp "<path to your jar>;<path to dependency 1>;<path to dependency 3>[;...]" <your main class>

您可能会考虑创建一个所谓的胖子罐,其中将包含所有需要的类。 例如: http : //fjep.sourceforge.net/

如果您不想自己管理所有依赖关系的麻烦,请考虑使用Maven https://maven.apache.org/或Gradle https://gradle.org/之类的构建工具。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM