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

时间:2014-01-06 14:58:40

标签: java intellij-idea optaplanner

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

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

jar使用的是ecta-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目录中,并将它们作为Extracted Directory添加到jar工件的根目录中,IntelliJ IDEA是v13.0.1。

7 个答案:

答案 0 :(得分:237)

我遇到了同样的问题。

确保您的MANIFEST.MF位于:

src/main/resources/META_INF/

不是

src/main/java/META_INF/

答案 1 :(得分:10)

修复:

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

答案 2 :(得分:10)

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

  • 项目结构 - >文物 - > + Jar - >空
  • 中心窗格现在具有Create Manifest和Use Existing Manifest按钮。使用其中之一。
  • 如果我将具有自己的清单的依赖库提取到输出根中,我会遇到困难,他们似乎间歇性地覆盖新手动创建的清单。处理操作顺序似乎使其有效。

UPDATE:

这绝对是Idea中的一个错误。当提取目录时,This linked answer可靠地工作。实质上,您找到了.idea / JARNAME.xml,添加以下元素添加到jar的<root>元素的 very top 。新文件副本上方包含清单的任何提取元素都会破坏您的新清单。

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

答案 3 :(得分:6)

如果要指定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>

答案 4 :(得分: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工作!!!

我希望这会有所帮助。

答案 5 :(得分:0)

有几种方法可以生成可执行jar。使用IntelliJ的GUI功能是一种好方法。另一种方法是使用 Maven (或者类似于gradle,buildr等),它是构建服务器友好的:

或多或少可以从optaplanner示例maven build中复制粘贴:

  1. 最终用户jar(optaplanner-examples - * .jar)必须include the classpath of its dependencies in its manifest
  2. The sh and bat script必须相应地运行该jar。

答案 6 :(得分:0)

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

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

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