【发布时间】:2015-10-04 14:57:53
【问题描述】:
使用 Eclipse,我创建了一些解析器类,我想将其作为 jar 存档提供给另一个项目以进行验证。所以解析器项目是这样的:
ParserProject
- src
-- com.package.x
--- ClassA
--- ClassB
- lib
-- external1.jar
-- external2.jar
ClassA 和 ClassB 使用外部 jar 档案,例如 Jackson 或一些 Apache commons。为了向另一个项目提供功能,我将整个项目导出为 jar 存档和可执行 jar 存档(右键单击项目 > 导出... > Java > JAR 文件 > 选择所有文件和“导出生成的类文件和资源" > 完成)。
jar 文件创建时没有任何错误。当我在我的验证项目中使用parserproject.jar 时,我可以使用自动完成访问我的所有方法,但是当我运行验证项目时,我得到一个java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonParseException。
现在三件奇怪的事情:
所有 jackson jar 都包含在解析器项目中。此外,我可以在解析器项目中运行
main()方法,一切正常,没有出现ClassNotFoundException。当我在类路径中将
parserproject.jar添加到我的验证项目并在包资源管理器中打开 jar 存档时,parserproject.jar 似乎包含它需要的所有 jar。对于可执行 jar 存档,所有必需的外部 jar 都包含在
MANIFEST.MF(包资源管理器 > 验证项目 > 引用库 > + 除了 parserproject.jar > META-INF > MANIFEST.MF)。它看起来像这样:
清单版本:1.0 Rsrc-Class-Path: ./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-Main-Class: com.package.SchemeValidator 主类:org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
- 当且仅当我在我的验证项目中使用生成的 jar 文件时才会出现异常。如果我摆脱
parserproject.jar并改为定义对 ecplise 解析器项目的依赖项(右键单击验证项目 > 属性 > Java 构建路径 > 项目)我没有得到ClassNotFoundException.
所以现在我的问题是,我应该如何导出 jar 以便找到每个类。谢谢!
【问题讨论】:
-
从 Eclipse 创建时,外部 jar 文件不会添加到 jar 中。您不能将外部库与解析器 jar 一起提供给验证项目吗?
-
遗憾的是,我现在没有 Eclipse 可以测试。但如果我没记错的话,.jar 导出菜单中有一个“捆绑依赖项”选项。您可以使用它,否则,您必须将依赖项添加到 .jar 内的 MANIFEST 文件中。如果您知道要使用的主类,也可以不带 -jar 选项执行 .jar 并定义自己的类路径。很多选择:)
-
嗨@Sekkuar 谢谢你的回答。清单文件中提到了它们,但仍然出现异常。
-
清单中的类路径是“./
”。这意味着所有依赖项必须位于执行 .jar 的同一目录中。他们在吗?
标签: java jar classloader classnotfoundexception