IntelliJ Idea - 为项目生成 JAR:不包括库
IntelliJ Idea - generating JAR for project: libraries are not included
我正在使用 IntelliJ Idea (14.1.2) 开发一个简单的 java 命令行应用程序。
我的应用程序由两个模块组成:
- 仅包含 "main" class
的主模块
- 包含 "does things" 实际代码的库模块(该模块还包括并使用 maven 库)
从 IntelliJ 内部调试时一切正常,但现在我想构建一个 JAR 文件以便在 IDE 之外使用该工具。
因此,正如 IntelliJ 文档所建议的那样,我使用 "Artifacts" 菜单来设置在构建时生成的 JAR 工件。
JAR 似乎 构建正确,但事实并非如此。问题是:我的库模块中的代码不包含在 jar 中,只有主模块中的代码包含在内!事实上,最奇怪的是,我的库模块包含 的 maven 库的代码是 包含在 jar 中,而不是我的模块库本身的代码!
这显然意味着一旦主程序尝试使用库模块中的 class,最终的 jar 就会抛出 ClassNotFound 异常。
我不知道我做错了什么,依赖项都已设置,在 Artifact 创建菜单中我告诉它在 jar 中包含依赖项...
编辑:这是 IntelliJ 创建的脚本,一切看起来都井井有条:
<component name="ArtifactManager">
<artifact type="jar" build-on-make="true" name="delta.desktoptools.manifestgenerator:jar">
<output-path>$PROJECT_DIR$/out/artifacts</output-path>
<root id="archive" name="delta.desktoptools.manifestgenerator.jar">
<element id="module-output" name="delta.desktoptools.manifestgenerator" />
<element id="module-output" name="delta.desktoptools.lib" /> <!-- This doesn't get included :( -->
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/github/javaparser/javaparser-core/2.0.0/javaparser-core-2.0.0.jar" path-in-jar="/" />
</root>
</artifact>
</component>
编辑:为了更清楚起见,我的工件配置屏幕。如您所见,我的库模块的编译输出包含在工件中,但最终的 JAR 中不存在。
你是用intellij做Jar还是依赖maven任务?
如果您依赖于 pom,那么您需要添加带有依赖项的构建,详见此处
How can I create an executable JAR with dependencies using Maven?
好的,我解决了
我正在使用 JDK 1.7.x,IntelliJ Artifacts creator 必须有一些 incompatibility/bug(很奇怪,因为我很确定 Artifacts 生成器比 JDK 1.7 早很多,但无论如何)。
切换到 JDK 1.8.x 解决了问题(或者它触发了项目的 "deep cleanup" 或有效解决问题的效果)
编辑:经过进一步测试,发现 JDK 版本与它无关,我只是在测试各种东西,我认为解决方案就是这样,但事实并非如此。显然,问题是 IntelliJ 没有 "like" 我的库的名称 O.o
我将其从 delta.desktoptools.lib
重命名为 delta.desktoptools.library
,现在它已包含在内。很奇怪,但至少它有效。知道为什么会很有趣。也许以 .lib 结尾的包会触发某种名称 convention/reservation 规则?我对 IntelliJ 不够熟悉,无法确定...
我正在使用 IntelliJ Idea (14.1.2) 开发一个简单的 java 命令行应用程序。
我的应用程序由两个模块组成:
- 仅包含 "main" class 的主模块
- 包含 "does things" 实际代码的库模块(该模块还包括并使用 maven 库)
从 IntelliJ 内部调试时一切正常,但现在我想构建一个 JAR 文件以便在 IDE 之外使用该工具。 因此,正如 IntelliJ 文档所建议的那样,我使用 "Artifacts" 菜单来设置在构建时生成的 JAR 工件。
JAR 似乎 构建正确,但事实并非如此。问题是:我的库模块中的代码不包含在 jar 中,只有主模块中的代码包含在内!事实上,最奇怪的是,我的库模块包含 的 maven 库的代码是 包含在 jar 中,而不是我的模块库本身的代码! 这显然意味着一旦主程序尝试使用库模块中的 class,最终的 jar 就会抛出 ClassNotFound 异常。
我不知道我做错了什么,依赖项都已设置,在 Artifact 创建菜单中我告诉它在 jar 中包含依赖项...
编辑:这是 IntelliJ 创建的脚本,一切看起来都井井有条:
<component name="ArtifactManager">
<artifact type="jar" build-on-make="true" name="delta.desktoptools.manifestgenerator:jar">
<output-path>$PROJECT_DIR$/out/artifacts</output-path>
<root id="archive" name="delta.desktoptools.manifestgenerator.jar">
<element id="module-output" name="delta.desktoptools.manifestgenerator" />
<element id="module-output" name="delta.desktoptools.lib" /> <!-- This doesn't get included :( -->
<element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/github/javaparser/javaparser-core/2.0.0/javaparser-core-2.0.0.jar" path-in-jar="/" />
</root>
</artifact>
</component>
编辑:为了更清楚起见,我的工件配置屏幕。如您所见,我的库模块的编译输出包含在工件中,但最终的 JAR 中不存在。
你是用intellij做Jar还是依赖maven任务?
如果您依赖于 pom,那么您需要添加带有依赖项的构建,详见此处 How can I create an executable JAR with dependencies using Maven?
好的,我解决了
我正在使用 JDK 1.7.x,IntelliJ Artifacts creator 必须有一些 incompatibility/bug(很奇怪,因为我很确定 Artifacts 生成器比 JDK 1.7 早很多,但无论如何)。
切换到 JDK 1.8.x 解决了问题(或者它触发了项目的 "deep cleanup" 或有效解决问题的效果)
编辑:经过进一步测试,发现 JDK 版本与它无关,我只是在测试各种东西,我认为解决方案就是这样,但事实并非如此。显然,问题是 IntelliJ 没有 "like" 我的库的名称 O.o
我将其从 delta.desktoptools.lib
重命名为 delta.desktoptools.library
,现在它已包含在内。很奇怪,但至少它有效。知道为什么会很有趣。也许以 .lib 结尾的包会触发某种名称 convention/reservation 规则?我对 IntelliJ 不够熟悉,无法确定...