使用Intellij 2016创建Jar - 没有主要清单属性

时间:2016-06-12 16:20:23

标签: java intellij-idea jar

我在运行由Intellij创建的jar时获得no main manifest attribute。我提取了jar并观察到有另一个清单文件,而不是我在创建工件时指定的文件。

当我在IDE中打开清单时,它会正确显示所有内容,但在创建jar后,我会得到一个全新的清单文件。

Manifest-Version: 1.0
Main-Class: YoutubeList

我尝试了其他答案中的所有解决方案,但仍然没有做到正确。为什么创建一个简单的jar是Intellij中的一项任务,它应该可以帮助开发人员!

被修改

有时它不包含Jar中的.class文件,导致could not found or load class

10 个答案:

答案 0 :(得分:46)

我遇到了与maven构建相同的问题。 当您从项目结构设置(ctrl + alt + shift + S)创建工件时,您必须更改清单目录:

<project folder>\src\main\java 

将java更改为资源

<project folder>\src\main\resources

我还使用了选项提取到目标JAR,它运行良好。

修改

您可以在此处找到详细的详细步骤和其他解决方案:https://stackoverflow.com/a/45303637/2640826

答案 1 :(得分:5)

确保您的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>

(...当然插件的版本号可能不同)。

主要类别不完全合格,是导致人们建议将清单移动到另一个位置的原因(为了在本地满足参考)。

答案 2 :(得分:4)

我花了几天时间来解决它。我的解决方案:我加载了this answer中的项目。然后我比较并更正了加载的项目和我自己的项目的设置。我比较/纠正了:

  • 运行/调试配置
  • MANIFEST.MF
  • 在Progect Structure设置中:Project,Modules(标记为什么 来源,资源等),文物。

最后,我将META-INF放在资源目录中。

也许我做了多余的行动,但它对我有用:)

P.S。还需要在Progect Structure设置中选择“继承项目编译输出路径” - &gt;模块 - &gt;路径

enter image description here

答案 3 :(得分:2)

可以将META-INF文件夹放在mymethods.gradle中,但不能这样做:Intellij只是将所有内容放在*/resourcesmain/resources的根目录下生成的jar的级别,这就是它起作用的原因;但是在Java项目中,我们通常将它们放在项目根目录下,该根目录与test/resources处于同一级别。将它们放在“资源”下是违反惯例的,此外,它们不是资源文件。

确保您:

  • 在项目根目录下使用现有的src文件;
  • 主类是正确的
  • 在“项目结构”->“工件”面板下选中了MANIFEST.MF
  • Include in Project build标签中,除了“项目已编译的输出”外,文件中还列出了META-INF文件夹以包含在jar中。
  • 生成的文件类型为JAR,位于右上角

然后保存设置,再次构建,然后进入“构建”菜单以“构建工件..”,然后“构建” JAR。再次检查生成的jar,使用Output Layout运行。

enter image description here

答案 4 :(得分:1)

File / Project structure / Artifacts下,您可以指定jar的构建方式。您可以选择使用现有文件作为清单,也可以创建一个新文件,在这种情况下,您可以指定主类和类路径......

答案 5 :(得分:1)

对于Idea Intellij 2020:

  1. 消除混淆(如果存在)

  2. 删除/(移动到项目之外的某个地方)资源管理器中的META-INF文件夹

  3. 删除项目结构中的工件->工件->'-'

  4. 重建项目

  5. 再次将工件添加到项目结构->工件->'+'

  6. 重建项目

  7. 构建->构建工件。

现在新生产的罐子应该可以工作了

答案 6 :(得分:0)

实际上,我通过在build.gradle中添加以下几行来解决了该问题

jar {
    manifest {
        attributes 'Main-Class': 'class name'
    }
    from {
        configurations.compile.collect {
            it.isDirectory()? it: zipTree(it)
        }
    }
}

答案 7 :(得分:0)

在我的情况下,我在jar中添加了一些依赖项,jar本身生成了清单。我没有让它直接在Intellij中工作。但是,您可以做的是使用zip程序打开jar文件并自己添加Main类,然后将其复制回jar中:

enter image description here

答案 8 :(得分:0)

在IntelliJ Idea 2020中

遵循此video中的说明。

当您到达工件创建点(Ctrl + Shift + Alt + S)时,请更改清单的位置,如下所示。 (\ src \ main \ resources)

enter image description here

答案 9 :(得分:-1)

我发现了一个不同的解决方案。在用于构建.jar文件内容的IntelliJ项目结构对话框中,我不得不手动添加包含Manifest文件的META-INF文件夹。以下是它在项目结构对话框中查看结尾的方式。如果在jar内容列表中没有看到该文件夹​​,则清单文件不是jar文件的一部分。

This is part of the Project Structure Dialog box

手动包含文件夹的方式是单击加号,选择“目录内容”选项,然后导航到META-INF文件夹。