【问题标题】:Wrong Manifest.mf in IntelliJ IDEA created .jarIntelliJ IDEA 中的错误 Manifest.mf 创建了 .jar
【发布时间】:2014-01-24 00:27:24
【问题描述】:

我正在尝试通过 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。

【问题讨论】:

  • 你知道 ant、maven 或 gradle 之类的构建工具吗?
  • 我知道它们,但到目前为止我只使用过 make 和 .NET 对应物(NAnt、MSBuild)。如果 IntelliJ 的构建工具不能解决问题,我应该选择哪一个?
  • 投票纠正这个问题here,

标签: java intellij-idea optaplanner


【解决方案1】:

修复:

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

【讨论】:

  • 没有“使用现有清单”按钮,但是输出布局中的清单文件指向正确的位置 (...\src\main\java\META-INF\MANIFEST.MF)
  • 好的,必须删除 jar 工件并重新创建它,这次是“空”而不是“来自具有依赖项的模块”。得到“创建清单”和“使用现有清单”按钮,指向我的清单和读取的库并编译输出。与以前有两个不同之处: META_INF\MANIFEST.INF 现在明确包含在输出布局中,并且 jar 文件似乎生成正确。 :)
  • 这并不能解决问题,至少对我而言。然而,jamahn 的回答确实有效。
  • 低代表用户 @ ds-justice 添加的评论如下 - @grudolf 上面关于创建一个空 Jar 的评论是在与导入的 Gradle 项目苦苦挣扎几个小时后唯一对我有用的东西。这是一个重要的问题,请考虑将您的评论作为单独的答案重新发布。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。

    确保您的 MANIFEST.MF 位于:

    src/main/resources/META_INF/
    

    不是

    src/main/java/META_INF/
    

    【讨论】:

    • 这确实是正确的答案,当项目模板是Maven时,似乎Intellij IDEA放错了META-INF文件夹
    • 就我而言,我必须更改项目的布局。我以前有一个使用 maven 布局的项目,但我删除了对 maven 的支持。我从头开始重新创建一个项目,现在它可以工作了。
    • 这对我不起作用,我不得不将 Mainfest 文件移动到项目的根目录。
    • 是 maven 这么笨,把这个文件放到错误的目录下吗? :^)
    • @Kumait,IntelliJ 2017.1.5 中的问题仍然存在。我想知道 JetBrain 团队是否意识到这一点。
    【解决方案4】:

    我遇到了类似的问题。

    问题出在 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 工作!!!

    我希望这会有所帮助。

    【讨论】:

    • 我遇到了这种情况并得出了与您相同的结论: 项之间的换行符在 Eclipse 中有效,但在 Intellij IDEA 中无效。
    【解决方案5】:

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

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

    更新:

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

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

    【讨论】:

      【解决方案6】:

      如果你想指定主类,你必须在 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>
      

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-04
        • 2013-06-06
        • 2016-03-06
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        • 2023-01-11
        相关资源
        最近更新 更多