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

mal*_*din 32 java jar intellij-idea

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

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

Manifest-Version: 1.0
Main-Class: YoutubeList
Run Code Online (Sandbox Code Playgroud)

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

编辑

有时它不包括Jar中的.class文件 could not found or load class

Zso*_*aly 64

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

<project folder>\src\main\java 
Run Code Online (Sandbox Code Playgroud)

将java更改为资源

<project folder>\src\main\resources
Run Code Online (Sandbox Code Playgroud)

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

编辑

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

  • 我不知道我的IntelliJI IDEA 2017.2.6有什么用.但在我的问题中出现/ resources文件夹也.保持为src/META_INF /为我工作. (3认同)
  • 由 Jetbrains 论坛复制:“显然,IntelliJ 不读取位于 src/main/java 文件夹中的清单文件!工作解决方案:如票据中所建议的,我们将 /META-INF 文件夹移至 src/main/resources并重建神器。” (2认同)

Joo*_*ool 8

如果使用 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>
Run Code Online (Sandbox Code Playgroud)

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

主类不完全合格,导致人们建议将清单移动到另一个位置(以满足本地引用)。


Wes*_*Gun 7

将 META-INF 文件夹放入*/resources 可以,但不是这样:Intellij 只是将所有内容放在生成的 jar 的根级别下main/resourcestest/resources根级别中,这就是它的工作原理;但在Java项目中,我们通常将它们放在项目根目录下,与src. 将它们放在“资源”下是违反约定的,而且它们不是资源文件。

确保你:

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

然后,保存设置,再次构建,并进入“Build”菜单中的“Build Artifacts..”,并“构建”JAR。再次检查生成的jar,使用 运行java -jar

在此输入图像描述


Mak*_*vol 5

我花了几天时间解决它。我的解决方案:我加载了这个答案中存在的项目。然后,我比较并更正了已加载项目和我自己的项目的设置。我比较/更正了:

  • 运行/调试配置
  • 清单文件
  • 在Progect结构设置中:项目,模块(标记什么是资源,资源等),工件。

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

也许我做了过多的动作,但对我有用:)

PS还需要在Progect结构设置->模块->路径中选择“继承项目编译输出路径”

在此处输入图片说明