如何正确地从IntelliJ构建jar?


519

我有一个包含单个模块和一些依赖项的项目。我想在一个单独的目录中创建一个jar,其中包含已编译的模块。另外,我想在模块旁边提供依赖项。

无论我如何扭曲IntelliJ的“构建jar”过程,模块的输出都将显示为空(除了META-INF文件之外)。

Answers:


602

这是使用IntelliJ 10构建jar的方法http://blogs.jetbrains.com/idea/2010/08/quickly-create-jar-artifact/

File-> Project Structure-> Project Settings-> Artifacts->单击green plus sign-> Jar->From modules with dependencies...

上面将“骨骼”设置为将罐子保存到的位置。要实际构建并保存它,请执行以下操作:

提取到目标Jar

建立 构建工件| 建立

尝试从中提取.jar文件

项目名称| 出| 文物| ProjectName_jar | ProjectName.jar


9
当您包含的jar中的某些类使用RSA签名时,它将失败。
Asif Shahzad 2012年

1
@AsifShahzad请参阅以下答案,以构建具有签名依赖性的jar文件:stackoverflow.com/questions/41746177/…

5
此方法仍然失败,jar文件未执行
samuel owino

6
似乎有人真的很努力不让它工作。真可惜,它永远都行不通。我尝试了至少50种不同的答案,但都没有用。每次都有相同的故事。现在,我预留了一周时间将其作为罐子输出,因为我们公司中的每个人都认为在生产输出罐子时需要付出真正的努力。
很棒的

2
正如许多人在我之前写的那样,这是有时的简化。请参阅下面的@zsolt tolvali的答案。从IntelliJ的角度来看,最好在创建新项目时使JAR创建过程成为DEFAULT ACTIVITY,因为很少有人不需要它!
Etamar Laron '18

255

这在2017年仍然是一个问题,我希望它能对那里的人们有所帮助!我发现在IntelliJ 2017.2下创建工作罐的两种可能性

1.从IntelliJ创建工件:

  • 转到项目结构:

文件菜单

  • 创建一个新的工件:

创建一个新工件

  • 选择主类,并确保更改清单文件夹:

在此处输入图片说明

您必须更改清单目录:

<project folder>\src\main\java 

用“资源”替换“ java”

<project folder>\src\main\resources

它应该是这样的:

新清单的正确方法

  • 然后,选择要在jar中打包的依赖项,或者在jar文件附近

  • 要构建工件,请构建工件,然后选择“重建”。它将使用您的jar文件及其依赖项创建一个“输出”文件夹。

在此处输入图片说明

2.使用maven-assembly-plugin

将构建部分添加到pom文件

    <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目标,以最后执行

在此处输入图片说明

最终设定

  • 保存,然后运行

在此处输入图片说明

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

JAR文件位置


6
将清单目录更改为src / resources是关键!谢谢
〜– fantouch

3
清单路径是最关键的路径,感谢@Zsolt Tolvaly
星期五

2
我正在no main manifest attribute采用上述解决方案。没有人提到改变path to manifest。谢谢!
Prometheus

1
这应该是最佳答案。谢谢!
Giorgos Lamprakis

scala中的源代码怎么样?Java不是我正在使用的东西
Kiwy

135

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

如何.jar使用IntelliJ IDEA 14.1.5 创建一个:

  1. 文件>全部保存。
  2. 使用main方法运行驱动程序或类。
  3. 文件>项目结构。
  4. 选择选项卡“工件”。
  5. 单击窗口顶部附近的绿色加号按钮。
  6. 从添加下拉菜单中选择JAR。选择“来自具有依赖性的模块”
  7. 选择主类。
  8. 单选按钮应选择“提取到目标JAR”。按确定。
  9. 选中“在make基础上构建”框
  10. 按应用,然后按确定。
  11. 从主菜单中,选择构建下拉菜单。
  12. 选择构建构件选项。

1
你错过了什么吗?关于模块应该有一个选项。就我而言,由于安全原因,它正在通过错误创建JAR但JVM。
sonus21,2015年

我认为清单就是一切。由于安全性,您的Java设置可能会阻止它。还有其他人对此有想法吗?
user5442490

跟着一样,我有错误:运行此jar文件时找不到或加载主类JavaFundamentals.jar。这里解释:stackoverflow.com/questions/40636790/...
laggerok19

每当我要构建一个jar时,是否都必须执行此12个步骤的过程,还是IntelliJ会记住这些操作,以便您使用它的快捷方式?
安迪

31

对于那些像我一样从图像中受益的人:

File -> Project Structure

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明


4
@samuelowino我不喜欢你这么说。解释什么“根本不起作用”。
Crt

1
嘿@Crt我没有检查正确的jar文件,显然,Inteliji在不同的目录下生成了两个jar文件,对不起,
不好意思

15

这是maven项目的2个示例,逐步介绍:

方法1:使用maven和pom.xml构建jar

  1. 文件,新项目,Maven
  2. 创建一个包,在该包内创建一个Java程序 在此处输入图片说明
  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. 单击清洁,然后单击安装 在此处输入图片说明

  2. 您的jar文件将显示在目标文件夹中 在此处输入图片说明

  3. 使用java -jar测试您的jar

在此处输入图片说明

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

  1. 文件,新项目,Maven
  2. 创建一个包,在该包内创建一个Java程序(与上面相同)
  3. File-> Project Structure-> Project Settings-> Artifacts->单击green plus sign-> Jar->From modules with dependencies

很重要!

MANIFEST.MF必须位于您的资源文件夹中,而Main.Class需要引用{package}-{class-name-that-c​​ontains-main-class}

在此处输入图片说明 在此处输入图片说明

  1. 然后单击菜单上的构建,构建工件,构建

在此处输入图片说明

  1. 在out文件夹中找到jar

在此处输入图片说明

  1. 运行 :)

在此处输入图片说明


这可行。您能解释为什么MANIFEST.MF需要在该目录中吗?
乌贝戈什

这对我有帮助
Devendra Singraul

5

可能有点晚了,但是我设法解决了这一问题->用winrar打开并删除META-INF文件夹中的ECLIPSEF.RSA和ECLIPSEF.SF,而且放了“ Main-class:main_class_name”(不带“ .class”) )在MANIFEST.MF中。请确保在最后一行之后按两次Enter键,否则将无法正常工作。


对于已签名的依赖项,请查看以下答案:stackoverflow.com/questions/41746177/…–

真是个疯狂的问题。知道为什么会发生这种情况或如何解决?这种感觉哈克
安德鲁没有

5

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

java -jar xxxxx.jar

xxxxx.jar中没有主清单属性

解决方案是

您必须更改清单目录:

<project folder>\src\main\java 

将Java更改为资源

<project folder>\src\main\resources

终于,谢谢你的提示!
伦登

@rendon祝你好运!
Saeed

完美!效果很好
jafarmlp

2

我试图从多模块Kotlin应用程序构建一个jar,并得到了臭名昭著的“没有主要清单属性”错误。在中创建清单目录src/main/resources也不起作用。

而是src直接在中创建它时有效src/META-INF/MANIFEST.MF

在此处输入图片说明


嗨,谢谢,一切正常。但是现在我遇到一个新错误,即找不到资源“ java.desktop / javax.swing.ImageIcon java.lang.NullPointerException”
Shivam Mathur

2

在此处输入图片说明

就像上面的人说的那样,但我必须指出一点。您必须选中该复选框:

包含在项目构建中


1

想法8.1.3

Jar没问题,因为在“输出”目录(project / out / production //)中有已编译的输出

我想,您必须在构建jar之前运行“ make”

对于依赖项,只需检查“显示库”,然后选择所需的内容。


1

使用Maven,您可以使用以下插件:

 <build>
    <plugins>

        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>[path you class main]</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>

0

您可能想看看Maven(http://maven.apache.org)。您可以将其用作应用程序的主要构建过程,也可以仅通过“编辑配置”对话框来执行某些任务。如果您希望在Maven中创建模块的JAR的过程非常简单,那么您希望将其所有相关性包含在一个可自行执行的JAR中,这也是很简单的。

如果您以前从未使用过Maven,则想阅读使用Maven更好的构建


8
对于创建jar之类的简单任务,Maven显然是开销。也许是蚂蚁,但肯定不是行家。
朱里(Juriy)2010年

链接已
消失

1
@KathyA。谢谢-更新为使用Maven团队的建议。
加里·罗

5
如果它是如此琐碎,为什么不在您的答案中包括它呢?
nuzzolilo 2015年

1
因为我希望读者能够访问该站点并开始学习过程。
加里·罗

0

如果您在项目中使用第三方库,或者在正确创建MANIFEST.MF文件时遇到问题,则在运行使用生成的JAR文件时可能会发生冲突。

File > Project Structure > Artifacts > '+' > JAR > From modules with dependencies > .....

上面提到的方法。

相反,我建议您创建一个空的JAR并将所有其他元素手动添加到输出根目录。可以在这里找到有关此方法的精彩博客文章:http : //karthicraghupathi.com/2016/07/10/creating-an-executable-jar-in-intellij-idea/我尝试了此处提到的步骤,并且一切正常为了我!


谢谢,这对我有帮助!Intellij中似乎存在一个错误,如果您选择“ JAR”作为工件类型而不是“其他”,则项目清单会在JAR中被默认清单覆盖。
红色

0

其他一些答案没有用,因为一旦您从maven项目中重新导入IntelliJ IDEA项目,所有更改都将丢失。

jar的构建需要通过运行/调试配置而不是项目设置来触发。

Jetbrains很好地描述了如何在此处完成此操作:

https://www.jetbrains.com/help/idea/maven.html

向下滚动到“配置Maven目标的触发器”部分。

(它们描述的唯一缺点是,它们的屏幕截图采用默认的黑白配色方案,而不是超棒的darcula主题。该死!)

因此,基本上,您要做的是打开“ Maven项目”面板,找到感兴趣的项目(在您的情况下,是构建jar的项目),在其下方找到了要执行的Maven目标,(通常是“ package”目标创建jar),打开它的上下文菜单,(在Windows计算机上单击鼠标右键),然后会有一个“在运行/调试之前执行...”选项,选择,它将从那里牵手您。真的很容易


0

如果您试图用kotlin来构建jar,则需要创建一个src/main/java文件夹并将该文件夹用作META-INF文件夹的位置。


0

这是IntelliJ IDEA 2018.3帮助的官方答案。我尝试了,它起作用了。

从模块构建JAR文件;

  1. 在主菜单上,选择“生成” |“创建”。建立神器。

  2. 从下拉列表中,选择所需的JAR类型工件。 该列表显示了为当前项目配置的所有工件。要构建所有已配置的工件,请选择“构建所有工件”选项。


0

我的问题是:我使用了Intellij IDEA(尝试了不同的版本)+ Gradle。如上面的响应所示,当我编译项目并构建artifacf jar时,我收到一个错误-“无主清单attrubute ...”

此解决方案对我有用(特别感谢Thilina Ashen Gamage(请参见上文)的提示):

摘录-如果您使用外部库并通过项目设置-工件-添加(+)-Jar-来自具有依赖项的模块来构建项目,则可能是由于程序错误导致带有MANIFEST_MF文件的META-INF文件夹不包含到jar中。为了避免这种情况,请创建EMPTY jar文件。

项目设置-工件-添加(+)-Jar-EMPTY JAR。META-INF文件夹将添加到资源文件夹。然后选择您的主班。您将看到以下jar结构: 请注意是否存在文件夹META-INF 注意文件夹META-INF的存在然后,您可以构建项目并构建构件。该解决方案也适用于javaFX应用程序。


-1

如果您正在从事spring / mvn项目,则可以使用以下命令:

mvn package -DskipTests

jar文件将保存在目标目录中。


-3

蚂蚁和Maven被广泛使用。我更喜欢Ant,我觉得它更轻巧,而且您可以更好地控制开发人员。有人会建议这是它的缺点:-)


3
这并不能解释错误发生的原因。
baordog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.