104

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

4

7 回答 7

267

我有同样的问题。

确保您的 MANIFEST.MF 位于:

src/main/resources/META_INF/

不是

src/main/java/META_INF/
于 2014-01-12T11:31:01.057 回答
12

修理:

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

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

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

更新:

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

  <element id="directory" name="/META-INF">
    <element id="file-copy" path="$PROJECT_DIR$/modulename/src/META-INF/MANIFEST.MF" />
  </element>
于 2015-11-13T01:30:38.657 回答
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>
于 2016-01-12T13:11:51.520 回答
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>

清单.mf 工作!!!

我希望这有帮助。

于 2015-10-08T12:25:02.187 回答
0

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

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

  1. 最终用户 jar (optaplanner-examples-*.jar) 必须在其 manifest 中包含其依赖项的类路径
  2. 然后 sh 和 bat 脚本必须相应地运行该 jar。
于 2014-01-07T07:48:15.883 回答
0

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

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

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

于 2016-12-20T15:33:53.480 回答