使用 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/resourcestest/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 文件 [重复]

如何在intellij idea 2016.3.1中将jar包添加到external ligraries中

用intellij创建jar:“主类不可用或不可加载”