使用 Intellij 2016 创建 Jar - 没有主要清单属性
Posted
技术标签:
【中文标题】使用 Intellij 2016 创建 Jar - 没有主要清单属性【英文标题】:Creating Jar with Intellij 2016 - No main manifest attribute 【发布时间】:2016-10-13 02:09:43 【问题描述】:我在运行 Intellij 创建的 jar 时收到 no main manifest attribute
。我提取 jar 并观察到有 另一个 清单文件,而不是我在创建工件时指定的那个。
当我在 IDE 中打开清单时,它会正确显示所有内容,但在创建 jar 后,我会得到一个全新的清单文件。
Manifest-Version: 1.0
Main-Class: YoutubeList
我尝试了其他答案的所有解决方案,但仍然无法正确解决。为什么在 Intellij 中创建一个简单的 jar 是一项艰巨的任务,它应该帮助开发人员!
已编辑
有时它在 Jar 中不包含 .class 文件,导致 could not found or load class
【问题讨论】:
如果您有 Maven 或 Gradle 项目,则在您构建和打包项目时已经为您创建了 JAR。如果你没有使用依赖管理,你可能应该 "当您运行gradle build
时,Gradle 将编译和测试您的代码,并创建一个包含您的主要类和资源的 JAR 文件" - docs.gradle.org/current/userguide/tutorial_java_projects.html
我不是自动说的,我是在你建项目的时候说的
是的,我的意思是当你构建项目时。
勾选“包含在项目构建中”。请参阅下面的答案。
【参考方案1】:
在File
/ Project structure
/ Artifacts
下,您可以指定构建 jar 的方式。您可以选择使用现有文件作为清单,也可以创建一个新文件,在这种情况下,您可以指定主类和类路径...
【讨论】:
我做到了。我指定了主类,但生成的 jar 不包含该清单文件。 这就是它的完成方式...再次检查您是否构建了正确的 jar,再次检查它的设置,也许做一个清理。否则,我没有想法...... 我在某处读到,如果您的依赖库之一未签名,则无法在同一个 jar 中解压缩和压缩它们。尝试使用另一个选项:“复制到输出目录并通过清单链接”。顺便说一句,我正在使用 Intellij IDEA v2016.2.5【参考方案2】:我在 Maven 构建中遇到了同样的问题。 当您从项目结构设置(ctrl+alt+shift+S)创建工件时,您必须更改清单目录:
<project folder>\src\main\java
把java改成资源
<project folder>\src\main\resources
我还对目标 JAR 使用了选项提取,并且效果很好。
编辑
您可以在此处找到详细的分步、其他解决方案:https://***.com/a/45303637/2640826
【讨论】:
我不得不在 gradle 中调整 jar 任务。 它非常适合我。但是无法找到更改路径的配置,因此我从 windows explorar 中对其进行了更改.. 工作正常.. 我不知道我的 IntelliJI IDEA 2017.2.6 是怎么回事。但在我的 /resources 文件夹中也出现了问题。将其保留为 src/META_INF/ 对我有用。 由 Jetbrains 论坛复制:“显然,IntelliJ 不读取位于 src/main/java 文件夹中的清单文件!工作解决方案:按照票证中的建议,我们移动了 /META- INF 文件夹到 src/main/resources 并重建工件。” IntellijIdea 2018.2 仅 @Abhishek Saini 解决方案有效。【参考方案3】:我花了几天时间来解决它。我的解决方案:我加载了一个存在于this answer 中的项目。然后我比较并更正了加载项目和我自己项目的设置。我比较/更正了:
运行/调试配置 清单.MF 在项目结构设置:项目、模块(标记什么是 来源、资源等)、工件。最后,我把META-INF放到了resources目录下。
也许我做了多余的动作,但它对我有用:)
附:还需要在Progect Structure settings -> Modules -> Path中选择“Inherit project compile output path”
【讨论】:
我按照jetbrains.com/help/idea/… 中的步骤进行操作,但遇到了这个问题。我刚刚将 /META-INF/* 文件夹从 /java 移动到 /resources 目录。这对我有用!【参考方案4】:我找到了与发布的解决方案不同的解决方案。在用于构建 .jar 文件内容的 IntelliJ 项目结构对话框中,我必须手动添加包含 Manifest 文件的 META-INF 文件夹。这是它在项目结构对话框中最后的样子。如果您在 jar 内容列表中没有看到该文件夹,则清单文件不是 jar 文件的一部分。
我手动包含文件夹的方法是单击加号,选择目录内容选项,然后导航到 META-INF 文件夹。
【讨论】:
【参考方案5】:如果使用 Maven,请确保您的 pom.xml 具有引用并完全限定的主类,类似于:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<mainClass>org.mypkg.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
(……当然插件的版本号可能不同)。
主类不完全合格,导致人们建议将清单移动到另一个位置(以满足本地参考)。
【讨论】:
这对我不起作用......我是否理解它的完成方式因使用 maven、gradle、......而有所不同? 对我也没有帮助 现在出现另一个错误:错误:无法找到或加载主类【参考方案6】:其实我是通过在build.gradle
中添加以下几行来解决的
jar
manifest
attributes 'Main-Class': 'class name'
from
configurations.compile.collect
it.isDirectory()? it: zipTree(it)
【讨论】:
【参考方案7】:将 META-INF 文件夹放在*/resources
可以,但不是办法:Intellij 只是将所有在main/resources
或test/resources
下的所有放在生成的jar 的根目录下,这就是它起作用的原因;但是在Java项目中,我们通常将它们放在项目根目录下,与src
处于同一级别。将它们放在“资源”下是违反惯例的,而且它们不是资源文件。
确保你:
使用项目根目录下已有的MANIFEST.MF
文件;
主类正确
在“项目结构”->“工件”面板下勾选了Include in Project build
在文件中列出了META-INF
文件夹以包含在 jar 中,除了“项目编译的输出”,在 Output Layout
选项卡中
生成的文件类型是JAR,在右上角
然后,保存设置,再次构建,然后进入“构建”菜单以“构建工件..”,然后“构建”JAR。再次检查生成的 jar,使用java -jar
运行。
【讨论】:
【参考方案8】:在我的例子中,我在我的 jar 中添加了一些依赖项,它本身生成了一个 Manifest。我没有让它直接从 Intellij 中工作。但是,您可以用 zip 程序打开 jar 文件并自己添加 Main 类,然后将其复制回 jar 中:
【讨论】:
【参考方案9】:对于 Idea Intellij 2020:
如果存在则删除混淆
删除/(移动到项目外的某处)资源管理器中的META-INF
文件夹
删除项目结构中的工件--> 工件--> '-'
重建项目
再次将工件添加到项目结构--> 工件--> '+'
重建项目
构建-->构建工件..
现在新生成的 jar 应该可以工作了
【讨论】:
【参考方案10】:在 IntelliJ Idea 2020 中
按照video 中的说明进行操作。
当您到达工件创建点 (Ctrl + Shift + Alt + S) 时,更改清单的位置,如下所示。 (\src\main\resources)
【讨论】:
对我不起作用,你在使用 Gradle 吗?以上是关于使用 Intellij 2016 创建 Jar - 没有主要清单属性的主要内容,如果未能解决你的问题,请参考以下文章
我已经使用 IntelliJ 创建了一个 jar,但是当我尝试运行该 jar 时,我收到一个错误,因为无法加载主类清单 [重复]
IntelliJ Spring Boot:如何创建可执行的 jar
在 IntelliJ IDEA 中创建 Java Gradle 项目并构建 .jar 文件 - 如何?
使用 Intellij 为 Java 代码创建 Jar 文件 [重复]