如何像在 Eclipse 中一样在 IntelliJ 中创建可运行的 JAR

Posted

技术标签:

【中文标题】如何像在 Eclipse 中一样在 IntelliJ 中创建可运行的 JAR【英文标题】:How do I create a runnable JAR in IntelliJ as I would in Eclipse 【发布时间】:2017-06-04 09:51:51 【问题描述】:

我使用 Eclipse 从包含许多库的项目创建可运行 JAR 的过程是。

导出 > 可运行 JAR > 选择启动配置 > 将所需库打包到生成的 JAR > 完成

这会在我的导出目标中创建一个 JAR,我 FTP 到我的服务器并运行良好。

我最近出于各种原因切换到 IntelliJ,除了构建我的 JAR 迫使我暂时回到 eclipse 之外,它在所有情况下都得到了改进。

使用 IntelliJ I:

打开项目结构 > 工件并从具有依赖关系的模块创建一个新的 JAR。然后,我的输出布局包含 JAR 的名称、其中的 META-INF 以及格式为 Extracted <lib.jar/> 的所有库(抱歉,我无法在此 *** 上上传屏幕截图。)

我构建了我的工件(大约 15MB 大)并将其 FTP 到我的服务器,尝试运行它并收到错误:

Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

如何模仿我在 Eclipse 中的操作方式?

编辑

创建的两个 JAR 差别很大:

Eclipse 创建的有效 jar 如下所示:

而无效的 .JAR 看起来像这样:

【问题讨论】:

它是一个 maven 项目吗?你可以使用maven-shade-plugin 很遗憾,这不是 Maven。 可以在jar任务运行jar任务jar manifest attributes 'Main-Class': 'class name' from configurations.compile.collect it.isDirectory()? it: zipTree(it) 中添加Main Class 这里没有介绍吗? ***.com/questions/1082580/… 这就是为什么您应该为所有项目使用构建工具而不是依赖于您的 IDE。您可以使用 Ant、Gradle 或 Maven 创建可运行的 jar。然后,您只需配置一次构建工具,然后无论使用什么 IDE,它都可以正常工作。 【参考方案1】:

您面临两个问题,一个看起来很重要,一个看起来很小:

重大:签名异常 次要:jar 的大小比 eclipse 生成的 jar 大 15 MB。

这两个问题的解决方案在于构建工件的方式。首先移除所有extracted *.jar,然后如图所示从可用元素pan中添加所有jar。

很明显,仅添加打包(压缩)的 jar 会减小大小。但它也解决了签名问题。如需更多解释,请查看此article。我只引用一行。

最好保持官方 jar 原样,然后将其添加为 清单文件中的依赖......

似乎某些依赖项已签名并且重新打包会弄乱您项目的 META-INF。

【讨论】:

我在这样做后得到java.lang.NoClassDefFoundError: scala/Function0。显然它没有正确设置类路径。【参考方案2】:

如果您使用 Maven,则需要将 META-INF 目录放在 /main/resources 文件夹下,而不是 main/java

参考:Intellij - Nikolay Chashnikov

然后就可以用java -jar filename.jar正常执行runnable jar了

【讨论】:

就是在找这个!【参考方案3】:

您可以执行以下步骤:

1) 文件 -> 项目结构 -> 项目设置 -> 工件 -> Jar -> 来自具有依赖关系的模块

2) 选中“包含在项目构建中”复选框。

3) 鼠标右键单击模块 -> 构建模块'ModuleName'

【讨论】:

【参考方案4】:

您可以尝试使用 gradle 脚本。 eclipse 会让你成为一个 gradle 项目。您可以在任何 ide 中使用该构建文件。它有一个内置的 jar 任务。

【讨论】:

以上是关于如何像在 Eclipse 中一样在 IntelliJ 中创建可运行的 JAR的主要内容,如果未能解决你的问题,请参考以下文章

如何使回车键将光标移动到 Android Studio 中的行尾,就像在 Eclipse 中一样

像在eclipse中一样在intellij想法中关闭未使用的模块

是否可以像在 Android Studio 中一样在 Eclipse 中使用 Firebase? [复制]

像在 Visual Studio 中一样在 Eclipse 中自动完成

是否可以像在 VS 中拖动箭头一样在 java eclipse 调试器中“返回”

在 IntelliJ IDEA 中更改 Ctrl+Shift+Left/Right 的行为,就像在 Eclipse 中一样