如何在IntelliJ IDEA中正确构建JAR文件?

657

我有一个包含单个模块和一些依赖项的项目。 我想创建一个JAR文件,放在另一个目录中,其中包含已编译的模块。此外,我希望我的模块旁边存在依赖项。

无论我如何调整IntelliJ的“构建JAR”过程,我的模块的输出都是空的(除了一个META-INF文件)。

24个回答

782

说明:

文件 -> 项目结构 -> 项目设置 -> 构件 -> 点击+(加号) -> Jar -> 从带有依赖项的模块...

如果需要使jar可运行,请选择主类(具有main()方法的类)。

选择提取到目标Jar

点击确定

点击应用/确定

以上设置了jar将保存到的“骨架”。要实际构建和保存它,请执行以下操作:

构建 -> 构建构件 -> 构建

尝试从以下位置提取.jar文件:

ProjectName
 ┗ out
   ┗ artifacts
     ┗ ProjectName_jar
        ┗ ProjectName.jar

参考资料:


12
当您包含的jar文件中的某些类使用RSA进行签名时,它将失败。 - Asif Shahzad
16
这种方法仍然失败了,JAR文件无法执行。 - Samuel Owino
32
似乎有人非常努力地让它无法运行。很遗憾它从未起作用。我尝试了至少50个不同的答案,但没有一个有效。每次都是同样的情况。现在我预留一周的时间来将其输出为jar文件,因为我们公司的每个人都认为这是一个需要真正付出努力才能产生输出jar文件的项目。 - Awesome
5
许多人在我之前已经写过,这是一种有时可行的简化方法。请参阅下面@zsolt tolvali的答案。从IntelliJ的角度来看,在创建新项目时,将JAR创建过程设置为默认活动会很好,因为很少有人不需要它! - Etamar Laron
95
快到2020年了,我们已经有了几乎能够自动驾驶的汽车,但我们仍然无法弄清楚如何在Intellij中创建可执行的jar文件。 - 1234
显示剩余14条评论

376

这个问题在2017年仍然存在,希望能帮助到某些人!

我找到了两种方法可以在IntelliJ 2017.2下创建可工作的jar文件:

1. 从IntelliJ创建Artifact:

  • 进入项目结构:

File menu

  • 创建一个新的Artifact:

Create a new artifact

  • 选择主类,并确保更改Manifest目录:

enter image description here

您需要更改Manifest目录:

<project folder>\src\main\java 

用"resources"替换"java"

<project folder>\src\main\resources

以下是正确的显示方式:

新清单的正确方式

  • 然后,选择您想要打包到JAR文件中或与其相邻的依赖项

  • 构建您的工件,请转到“构建工件”并选择“重建”。 它将创建一个带有您的JAR文件及其依赖项的“out”文件夹。

输入图像说明

2.使用maven-assembly-plugin

在pom文件中添加build部分

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <finalName>ServiceCreate</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <archive>
                        <manifest>
                            <mainClass>com.svt.optimoo.App</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
  • 创建一个新的运行/调试配置:

创建一个新的运行/调试配置

  • 选择应用程序:

选择应用程序

  • 填写表单
  • 在构建之后添加 "assembly:single" Maven 目标以最后执行

输入图像描述

最终设置

  • 保存配置,然后运行

输入图像描述

此过程将在“target”文件夹下创建jar文件。

JAR文件位置


15
将清单目录更改为src/resources是关键点!!! 谢谢~ - fantouch
4
这个 MANIFEST 路径是最关键的,谢谢。@Zsolt Tolvaly - fruqi
6
我遇到了“no main manifest attribute”错误,尝试了上述解决方案但没有成功。没有人提到更改“清单路径”。谢谢! - Prometheus
3
这应该是最佳答案。谢谢! - Yorgos Lamprakis
1
那么Scala的源代码怎么样?我不使用Java。 - Kiwy
显示剩余12条评论

151

我最近遇到了这个问题,认为如果缺少任何先前的解决方案或链接的细节,这些步骤很容易遵循。

如何使用IntelliJ IDEA 14.1.5创建.jar

  1. 文件 > 全部保存。
  2. 运行具有主方法的驱动程序或类。
  3. 文件 > 项目结构。
  4. 选择选项卡“Artifacts”。
  5. 单击窗口顶部附近的绿色加号按钮。
  6. 从添加下拉菜单中选择JAR。选择“从带依赖关系的模块”
  7. 选择主类。
  8. 单选按钮应选择“提取到目标JAR”。按OK键。
  9. 选中“在制作时构建”复选框
  10. 按应用和确定。
  11. 从主菜单中,选择生成下拉菜单。
  12. 选择选项生成构件。

1
你有漏掉什么吗?关于模块,有一个选项应该是什么。在我的情况下,它是创建JAR文件,但是由于安全问题,JVM报错了。 - sonus21
我认为那个列表包含了所有的内容。你可能有一些Java设置问题,由于安全性而阻止了它。还有其他人对此有什么想法吗? - user5442490
遵循相同的步骤,我遇到了错误:在运行此jar文件时找不到或加载主类JavaFundamentals.jar。在这里有解释:https://dev59.com/pZzha4cB1Zd3GeqPG4xE - laggerok19
这个12步骤的过程每次我想要构建一个jar文件时都必须执行吗?或者IntelliJ会记住这些操作,以便您可以使用快捷方式进行操作? - Andy

50

对于像我一样需要图片的用户:

文件 -> 项目结构

在这里输入图片描述

在这里输入图片描述

在这里输入图片描述

在这里输入图片描述


7
@samuelowino,我不欣赏你那样说话。请解释一下“根本不起作用”的意思。 - kgui
1
嘿 @Crt,我没有检查正确的jar文件,显然,Inteliji在不同目录下生成了两个jar文件,抱歉,是我的错,你的解决方案有效,谢谢。 - Samuel Owino
@Crt 我尝试了上述步骤,但我一直收到“myFile-0.1.jar”中没有主清单属性的错误提示。 - tharindu

36

以下是使用Maven项目创建JAR文件的两个示例,步骤详解:

方法一:使用Maven和pom.xml构建JAR文件

  1. 选择“File”、“New”、“Project”、“Maven”。
  2. 创建一个包,并在此包中创建一个Java程序。enter image description here
  3. 在pom.xml文件中添加maven-jar-plugin插件。

    <plugin>
        <!-- Build an executable JAR -->
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
            <archive>
                <manifest>
                    <addClasspath>true</addClasspath>
                    <classpathPrefix>lib/</classpathPrefix>
                    <mainClass>somePackage.sample</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

屏幕截图: 输入图片描述 4. 点击搜索图标并输入maven,打开maven项目框, 输入图片描述

  1. 点击“clean”,然后点击“install” 输入图片描述

  2. 你的jar文件将出现在target文件夹中 输入图片描述

  3. 使用以下命令测试你的jar文件 java -jar

输入图片描述

方法2:使用maven构建jar文件而无需更改pom.xml

  1. 文件,新建,项目,maven
  2. 创建一个包,创建该包内的一个java程序(与上面相同)
  3. 文件 -> 项目结构 -> 项目设置 -> 构件 -> 点击绿色加号 -> jar -> 从带有依赖项的模块

非常重要!

MANIFEST.MF需要在你的资源文件夹中,Main.Class需要引用{package}-{class-name-that-contains-main-class}

输入图片描述 输入图片描述

  1. 然后在菜单上点击“build”、“build artifacts”、“build”

输入图片描述

  1. 在out文件夹中找到jar文件

输入图片描述

  1. 运行它吧 :)

输入图片描述


这个有效。你能解释一下为什么 MANIFEST.MF 需要在那个目录中吗? - Ubeogesh
这对我很有帮助。 - Devendra Singraul
这非常有帮助!第二个选项对我来说效果最好。快速更新一下:IntelliJ会打开一个额外的向导来创建清单文件。这将允许您在不编写任何内容的情况下创建并将其放置在正确的位置。 - Microbob
那非常有帮助。 - ronit

7

当我使用这些解决方案时,会出现以下错误:

java -jar xxxxx.jar

没有主清单属性,在xxxxx.jar中。 解决方法是: 您需要更改清单目录:
<project folder>\src\main\java 

将Java更改为资源

<project folder>\src\main\resources

我已经有这个了,但仍然存在问题。 - Trajan

6

可能有点晚了,但我用以下方法解决了这个问题 -> 用Winrar打开并删除META-INF文件夹中的ECLIPSEF.RSA和ECLIPSEF.SF。此外,在MANIFEST.MF中添加"Main-class: main_class_name"(不含“.class”),确保在最后一行按下“Enter”键两次,否则无法运行。


对于已签名的依赖项,请查看此答案:https://dev59.com/EFgR5IYBdhLWcg3wGaEK#43855741 - user2241537
这太疯狂了。你有任何想法为什么会发生这种情况或如何解决吗?这感觉像个hack。 - Andrew No

4
我试图从一个多模块Kotlin应用程序构建一个jar包,并且遇到了臭名昭著的“没有主清单属性”错误。在src/main/resources创建清单目录也不起作用。相反,当在src中直接创建它:src/META-INF/MANIFEST.MF时,它会奏效。

enter image description here


嗨,谢谢,它正常工作。但现在我有一个新的错误,它找不到资源“java.desktop/javax.swing.ImageIcon java.lang.NullPointerException”。 - Shivam Mathur

3

enter image description here

正如上面的人所说,但我必须注意一点。 你必须勾选复选框:

包括在项目构建中


2

使用

mvn clean package spring-boot:repackage

在IntelliJ终端中输入上述命令。它会生成一个可执行的Jar目标文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接