【问题标题】:Intellij Java 2016 & Maven : how to embed dependencies in JAR? [duplicate]Intellij Java 2016 & Maven:如何在 JAR 中嵌入依赖项? [复制]
【发布时间】:2017-01-09 11:26:21
【问题描述】:

我正在使用 Intellij Java 2016.2.2 和 Maven 创建一个非常简单的 Java 控制台应用程序。

我想添加一个外部库,所以我在 Maven 中添加我的依赖项,如下所示:

<dependency>
    <groupId>jline</groupId>
    <artifactId>jline</artifactId>
    <version>2.12</version>
</dependency>

当我在 IDE 中运行它时它运行良好,但在外部控制台中运行它却没有(我有以下错误:java.lang.NoClassDefFoundError)。

我检查了,由于某种原因,我刚刚生成的 JAR 中没有添加外部 JAR。我也在“文件 - >项目结构”中尝试了很多东西,但仍然无法正常工作......

我只想用我的依赖项构建我的 JAR,所以我可以简单地使用以下命令在控制台中运行我的应用程序:

java -jar myproject.jar

我该怎么做?感谢您的帮助!

【问题讨论】:

  • 通过 jar-with-dependencies 描述符使用 maven-assembly-plugin....
  • 感谢您的帮助,但仍然无法正常工作。所以我想知道:我使用“Build -> Build artifacts...”构建我的 JAR。这是正确的做法吗?

标签: java maven intellij-idea jar dependencies


【解决方案1】:

我终于设法用 Intellij Java 生成了这个 JAR,我是这样做的:

  • 在 pom.xml 文件中添加依赖项
  • 转到文件 -> 项目结构 -> 工件 -> 新建 -> JAR -> 从具有依赖项的模块
  • 选择主类并单击确定
  • 在您的项目中,在 src/main 中,创建“resources”文件夹
  • 将“META-INF”(其中包含 MANIFEST.MF)文件夹移动到此“资源”文件夹中
  • 转到构建 -> 构建工件以构建 JAR

编辑

一种更好(更简单)的方法是在 pom.xml 文件中添加以下行:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>your.MainClass</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

然后使用“clean”和“package”maven 命令。

上面的最后 3 个步骤(关于 MANIFEST.MF)似乎仍然是强制性的。

【讨论】:

    【解决方案2】:

    好的,所以您基本上想创建一个“胖 jar”(有时称为程序集),其中包含所有自己的依赖项(通常,依赖项是外部的)。

    您需要为此使用 Maven 插件。下面是一个示例程序集插件配置jar-with-dependencies

    <project>
      ...
      <build>
        ...
        <plugins>
          <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.6</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
            </configuration>
            ...
    </project>
    

    然后,只需运行

    mvn package
    

    【讨论】:

    • 谢谢,看起来很有趣!但是现在,另一个简单的问题:“没有主要清单属性”。似乎它无法找到我的 MANIFEST.MF 文件...有什么想法吗?
    • 不会创建一个具有依赖关系的 jar。
    • 虽然选择了描述符,但没有指定主类。此外,缺少执行部分。我们必须将 assembly:single 目标绑定到构建阶段或显式运行目标。 javabyexamples.com/…
    猜你喜欢
    • 2015-12-24
    • 1970-01-01
    • 2015-04-04
    • 2012-07-12
    • 2022-10-04
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多