【问题标题】:Adding external library to artifact jar in IntelliJ IDEA在 IntelliJ IDEA 中将外部库添加到工件 jar
【发布时间】:2017-07-01 00:06:03
【问题描述】:

如何将外部库添加到 IntelliJ IDEA 中的项目中,以便在构建工件时它仍然可以访问库中的类?

我从项目结构创建了一个新的 Jar 工件,然后将外部 JAR 添加到库中,然后在模块列表中检查它,最后将其添加到工件的输出中。这些都不起作用。当我构建并尝试运行我的应用程序时,它会引发错误:

Exception in thread "main" java.lang.NoClassDefFoundError: <path of the class trying to use>

我错过了什么,或者我这样做完全错误?

【问题讨论】:

    标签: java maven intellij-idea build dependencies


    【解决方案1】:

    如果您使用 maven 构建应用程序,那么这不是添加外部库的正确方法。你应该

    1. 像下面mvn install:install-file -Dfile=myJar.jar -DgroupId=com.yourproject -DartifactId=yourproject -Dversion={version} -Dpackaging=jar 那样安装您的库。
    2. 使用here 解释的系统路径。

    选项 1 是首选,因为您不必在项目中保留 jar。

    【讨论】:

    • 我其实不知道有没有使用Maven。我还没有创建任何构建文件。不确定 IDEA 是如何做到的,但我的假设是不需要构建文件。只有一个 MANIFEST.MF 文件。
    【解决方案2】:

    你有两个选择:

    • 将依赖项提取到工件 jar 中,使应用程序成为具有所有依赖项的单个可执行 jar
    • 通过Manifest.MF链接依赖的jar并将它们复制到应用程序主jar附近

    我准备了一个演示这两种方法的示例项目:HelloWithDependencies.zip

    工件被生成到out\singleout\linked 目录中。

    相关配置:

    【讨论】:

    • 你刚刚帮我解决了一个问题,我花了 25 多个小时,也许 2 周,试图破译。非常感谢!此外,这一切都有效,但它背后的主干是什么? IntelliJ 是否使用 Maven 或 Ant 或类似的东西?
    • 您可以使用基于Maven的项目,是的,但这与您的情况无关。当您向项目添加新依赖项时,它们不会自动添加到您已有的工件中,您需要再次查看工件配置并添加从 jar 运行应用程序所需的所有缺失库。另一个常见的错误是将一个 jar 包含在另一个不起作用的 jar 中,该 jar 必须在主 jar 中解压或复制到它附近并通过清单链接(不要忘记在清单中添加任何新 jar案例)。
    • 在基于 Maven 的项目中,可以使用 Maven 插件来创建具有依赖关系的 jar,您将通过运行 Maven 目标而不是使用 IntelliJ IDEA 工件配置来生成最终工件。这样,您添加到pom.xml 的所有新依赖项将自动出现在 Maven 生成的 jar 中。几乎同样适用于基于 Gradle 的项目。
    • 资源(如图像)在哪里适合?
    • 资源通常进入resources 目录(配置为资源根目录的目录)。在示例项目中,它与您看到log4j.properties 文件的目录相同。如果需要,您可以添加更多资源根目录,这些目录中的文件将出现在编译器输出中,因此您无需调整工件配置。
    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多