【问题标题】:IntelliJ Idea - generating JAR for project: libraries are not includedIntelliJ Idea - 为项目生成 JAR:不包括库
【发布时间】:2015-07-05 17:08:12
【问题描述】:

我正在使用 IntelliJ Idea (14.1.2) 开发一个简单的 java 命令行应用程序。

我的应用由两个模块组成:

  • 只包含“主”类的主模块
  • 一个库模块,其中包含“做事”的实际代码(该模块还包括并使用了一个 maven 库)

从 IntelliJ 中调试时一切正常,但现在我想构建一个 JAR 文件以便在 IDE 之外使用该工具。 因此,正如 IntelliJ 文档所建议的那样,我使用“Artifacts”菜单来设置要在构建时生成的 JAR 工件。

JAR 似乎可以正确构建,但事实并非如此。问题是:我的库模块中的代码不包含在 jar 中,只有主模块中的代码!事实上,最奇怪的是,我的库模块包含的 maven 库中的代码 包含在 jar 中,而不是我的模块库本身的代码! 这显然意味着一旦主程序尝试使用库模块中的类,最终的 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 中没有。

【问题讨论】:

    标签: java intellij-idea jar


    【解决方案1】:

    你是使用intellij制作Jar还是依赖maven任务?

    如果您依赖 pom,那么您需要添加带有依赖项的构建,详见此处 How can I create an executable JAR with dependencies using Maven?

    【讨论】:

    • 我正在使用 IntelliJ 本身。老实说,我从未使用过 maven,是否需要正确执行此操作? IntelliJ 中包含的 Artifacts 功能是否存在错误/不完整?我读过的所有文档似乎都表明 IntelliJ should 包含所需的依赖项......但它没有:(
    • 我认为 IntelliJ 只会添加项目中包含的依赖项,如果没有,您将在“可用元素”面板中提供它们,因此您只需将其拖到左侧,因此它包含在工件中(在本例中为 JAR 文件)
    • 我做了...我添加了一个屏幕截图和 IntelliJ 生成的脚本...它看起来对我来说是正确的:/
    【解决方案2】:

    好的,我解决了。

    我使用的是 JDK 1.7.x,IntelliJ Artifacts 创建者肯定有一些不兼容/错误(很奇怪,因为我很确定 Artifacts 生成器比 JDK 1.7 早了很多,但无论如何)。

    切换到 JDK 1.8.x 解决了这个问题(或者它触发了对项目的“深度清理”或类似的东西,有效地解决了问题)

    编辑:经过进一步测试,结果发现 JDK 版本与它无关,我只是在测试各种东西,我认为解决方案是这样,但事实并非如此。显然,问题在于 IntelliJ 不“喜欢”我的库 O.o 的名称 我将它从 delta.desktoptools.lib 重命名为 delta.desktoptools.library,现在它被包含在内。很奇怪,但至少它有效。知道为什么会很有趣。也许以 .lib 结尾的包会触发某种名称约定/保留规则?我对 IntelliJ 不够熟悉,无法确定...

    【讨论】:

    • @kuporific:您必须等待 24 小时才能接受自己的答案... PS:我看到您对有关 IntelliJ 的问题非常积极,有什么线索会发生这种情况吗?即使我解决了它,我也不知道为什么:D
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2021-10-29
    • 2013-07-24
    • 2016-01-15
    • 2011-04-17
    • 2023-03-31
    相关资源
    最近更新 更多