IntelliJ IDEA中错误的Manifest.mf创建了.jar


102

我正在尝试通过IntelliJ IDEA的jar工件将使用OptaPlanner 6.0.1库的项目打包到.jar中,而不是将我的manifest.mf包含标准

Manifest-Version: 1.0
Main-Class: a.b.c.app

jar使用ecj-3.7.2.jar中提供的一个,这是OptaPlanner的支持库之一:

Manifest-Version: 1.0
Build-Jdk: 1.6.0_26
Built-By: ibrandt
Created-By: Apache Maven
Archiver-Version: Plexus Archiver

因此,"no main manifest attribute, in appname.jar"尝试运行该应用程序时会发生错误。如果我手动将.jar文件中的清单替换为我的清单,则一切正常。有什么我可以解决的吗?

我将这些库保存在单独的/ lib目录中,并将它们作为提取目录添加到jar工件的根目录中,IntelliJ IDEA是v13.0.1。


1
您知道蚂蚁,maven或gradle等构建工具吗?
MariuszS 2014年

我了解它们,但到目前为止,我只使用了make和.NET对应版本(NAnt,MSBuild)。如果IntelliJ的构建工具无法削减,我应该选择哪一个?
grudolf 2014年

1
在这里投票解决这个问题,
bigjosh

Answers:


260

我有同样的问题。

确保您的MANIFEST.MF位于:

src/main/resources/META_INF/

src/main/java/META_INF/

20
确实,这是正确的答案,当项目模板为Maven时,Intellij IDEA似乎放错了META-INF文件夹
Kumait

就我而言,我不得不更改项目的布局。我以前有一个具有Maven布局的项目,但是我删除了对Maven的支持。我从头开始创建一个项目,现在它可以工作了。
Maxence

1
这对我不起作用,我不得不将Mainfest文件移动到项目的根目录。
拉斯

Maven太愚蠢了,以至于将此文件放到错误的目录中?:^)
Daria

@ Kumait,IntelliJ 2017.1.5中仍然存在此问题。我想知道JetBrain团队是否意识到这一点。
fruqi

12

修理:

  1. 文件>项目结构
  2. 在左侧的“ 项目设置 ”下,选择“工件”
  3. 在中间窗格中找到JAR定义并选择它
  4. 在“输出布局”选项卡的左窗格中,在列表中找到jar文件并选择它
  5. 在底部,单击“使用现有清单”按钮,然后选择项目源中的清单文件。
  6. 单击确定并运行构建

3
没有“使用现有清单”按钮,但是“输出布局”中的清单文件指向正确的位置(... \ src \ main \ java \ META-INF \ MANIFEST.MF)
grudolf 2014年

5
OK,必须删除jar工件并重新创建它,这次是“ Empty”,而不是“来自具有依赖项的模块”。得到了“创建清单”和“使用现有清单”按钮,指向我的清单和读取的库并编译输出。与以前有两个区别:META_INF \ MANIFEST.INF现在明确包含在输出布局中,并且jar文件似乎正确生成。:)
grudolf

至少对于我来说,这并不能解决问题。jamahn的答案确实起作用。
安德鲁·布雷萨

低代表用户@ ds-justice添加的评论如下-@grudolf关于创建一个空Jar的评论是在与导入的Gradle项目进行了数小时的奋斗之后唯一对我有用的东西。这是一个重要的问题,请考虑将您的评论重新发布为单独的答案。
肖恩·梅汉

10

正如@grudolf在其他答案之一中的评论中所指出的那样,一种方法(也是在导入的Gradle项目中对我有用的唯一方法)是创建一个空jar,如下所示:

  • 项目结构->工件-> +罐->空
  • 中心窗格现在具有“创建清单”和“使用现有清单”按钮。使用其中之一。
  • 如果我将带有它们自己的清单的依赖库提取到输出根目录中,将会遇到困难,它们似乎会间歇性地覆盖新的手动创建的清单。弄乱操作顺序似乎可以使其正常工作。

更新:

这绝对是Idea中的错误。 当提取目录时,此链接的答案可靠地工作。在本质上,你会发现你的.idea / JARNAME.xml,添加下面的元素添加到最顶端的的<root>为你的jar元素。新文件副本上方包含清单的所有提取元素都会破坏您的新清单。

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>

7

如果要指定Main Class,则必须将此插件添加到pom.xml中:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <archive>
            <manifest>
                <mainClass>Form</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

1

我有一个类似的问题。

问题出在文件pom.xml中。

<archive>
  <manifestEntries>
    <Dependencies>one.jar,
                  two.rar, 
                  other.jar
    </Dependencies>
  </manifestEntries>
</archive>

我不知道这段代码在Eclipse中工作的原因是什么,但是在IntelliJ中却不行

这是正确的。

<archive>
  <manifestEntries>
    <Dependencies>one.jar, two.rar, other.jar</Dependencies>
  </manifestEntries>
</archive>

Manifest.mf工作了!!!

我希望这有帮助。


我遇到了这种情况,并得出了与您相同的结论:<Dependencies>项之间的换行符在Eclipse中有效,但在Intellij IDEA中不起作用。
Arion Krause


0

为了像清单一样没有问题,您应该在“ src”目录中有一个名为“ META-INF”的目录。因此,创建它并在其中放入一个名为“ MANIFEST.MF”的文件,其中包含以下内容:

Manifest-Version: 1.0
Main-Class: <packageName>.Main

不要忘记替换上面包含Main类的包名称!


4
记录显示,八月份我从您的帖子中删除了宗教材料。请注意,社区已经讨论过将宗教主题添加到帖子中,而答案是我们希望将其排除在外。不过,我们非常欢迎您将它们添加到您的个人资料或头像中。
Halfer 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.