java IntelliJ IDEA中错误的Manifest.mf created .jar

5ssjco0h  于 2023-03-28  发布在  Java
关注(0)|答案(8)|浏览(161)

我试图通过IntelliJIDEA的jar工件将一个使用OptaPlanner6.0.1库的项目打包到一个.jar文件中,但不是我的包含标准

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

jar使用ecj-3.7.2.jar中提供的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。

snvhrwxg

snvhrwxg1#

我也有同样的问题。
确保您的MANIFEST.MF在:

src/main/resources/META_INF/

src/main/java/META_INF/
qlvxas9a

qlvxas9a2#

要修复:
1.* 文件〉项目结构 *
1.在左侧的 * 项目设置 * 下,选择“Artifacts”
1.在中间窗格中找到JAR定义并选择它
1.在“OutputLayout”选项卡的左窗格中,在列表中找到jar文件并选择它
1.在底部,单击“Use Existing Manifest”按钮并选择项目源中的清单文件。
1.单击OK并运行构建

d5vmydt9

d5vmydt93#

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

  • 项目结构-〉工件-〉+jar-〉空
  • 中心窗格现在有“创建清单”和“使用现有清单”按钮。请使用其中一个按钮。
  • 如果我将依赖库与它们自己的清单提取到输出根目录中,我会遇到困难,它们似乎会间歇性地覆盖新手动创建的清单。

更新:

这绝对是Idea中的一个bug。当有提取目录时,这个链接的答案可靠地工作。本质上,你找到你的.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>
xienkqul

xienkqul4#

如果你想指定主类,你必须将这个插件添加到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>
r3i60tvu

r3i60tvu5#

我也有类似的问题。
问题出在文件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工作!!!
希望这能帮上忙。

cgyqldqp

cgyqldqp6#

有几种方法可以生成可执行的jar文件。使用IntelliJ的GUI功能是一种很好的方法。另一种方法是使用Maven(或类似的gradle,buildr等),这是构建服务器友好的:
它或多或少可以从optaplanner示例maven build中复制粘贴:
1.最终用户jar(optaplanner-examples-*.jar)必须在其清单中包含其依赖项的类路径。

  1. The sh and bat script必须相应地运行该jar。
7d7tgy0s

7d7tgy0s7#

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

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

别忘了替换上面包含Main类的包的名称!

i7uaboj4

i7uaboj48#

请按照此处详细说明的步骤操作
https://www.jetbrains.com/help/idea/2022.2/convert-a-regular-project-into-a-maven-project.html#develop_with_maven
单击Build Project图标构建项目。IntelliJ IDEA会生成目标文件夹。请注意,IntelliJ IDEA只编译源文件,不会创建JAR文件或Manifest文件。
在resources目录中创建一个Manifest文件。
右键单击目录,选择“新建|目录创建META-INF子目录|文件来创建MANIFEST.MF文件。
清单文件在编辑器中打开MANIFEST.MF文件并添加有关主类的信息。
检查以下代码:
或者,我们可以要求Maven将这行代码添加到MANIFEST.MF文件中,并在pom.xml中包含以下代码:
maven-jar-plugin com.company.MyApp在您的POM中指定Manifest文件信息,以便您可以使用Maven生成可执行的jar文件。
或者,您可以执行package而不是install命令来实现相同的结果。

相关问题