[英]Intellij Executable Jar - no main manifest attribute Vs Could not find or load main class
我正在使用 Intellij 想法開發一個小型 Java 應用程序。 有一個包和一個類。 該類在 jar 格式之外時按預期運行。
我可以構建一個 jar 並將所有依賴項部署到同一目錄,並且 jar 可以按預期工作(在配置 jar 構建過程時,我將復制到輸出路徑並通過清單選項鏈接)。 但是,當我嘗試構建一個包含在同一個 jar 文件中的所有依賴項的胖 jar 時,根據META-INF/MANIFEST.MF
的位置,我得到兩個錯誤之一:沒有主清單屬性和無法找到或加載主類。
鑒於如果所有依賴項與所述 jar 文件位於同一目錄中,我可以獲得一個工作 jar 文件,我認為問題出在類路徑上。
META-INF/MANIFEST.MF
內容如下:
Manifest-Version: 1.0
Main-Class: myPackage.myClass
Class-Path: . myClassJarName.jar
生成 jar 時,我會在結構的根部看到META-INF/MANIFEST.MF
,其中包含正確的信息。
jar 的根目錄中還有myPackage/myClass.class
,對應於清單文件。
我也可以看到 jar 文件中的所有依賴項。
我的項目結構如下所示 - 請注意,我添加了兩個我嘗試過的清單文件以及每個文件附帶的錯誤:
.idea
out
artifacts
myPackage_jar
myPackage.jar
src
main
java
myPackage
myClass.java
META-INF <-------------------- *If here, Error: Could not find or load main class err*
MANIFEST.MF
META-INF < ------------------ *If here no main manifest attribute err*
MANIFEST.MF
test
java
myPackage
myClass.java
target
classes
myPackage
myClass
generated-sources
generated-test-sources
test-classes
mypackage.iml
pom.xml
...它的 pom 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>myPackage</groupId>
<artifactId>myPackage</artifactId>
<version>1.0-SNAPSHOT</version>
<name>anonymise</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>hortonworks</id>
<name>hortonworks</name>
<url>https://repo.hortonworks.com/content/repositories/releases/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.3.2.6.2.0-205</version>
</dependency>
<dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1000.2.6.2.69-1</version>
</dependency>
</dependencies>
</project>
我配置jar工件的方式是:
src/main
(完整路徑)中設置了META-INF/MANIFEST.MF
Manifest 目錄myPackage compile output
在應用和確定之后,我生成了 jar 文件,正如我所期望的那樣,在 jar 根目錄中有META-INF/MANIFEST.MF
和myPackage/myClass
,以及所有其他依賴項。 但是,當我嘗試通過以下方式運行 jar 時:
cd
到 jar 的位置並使用java -jar myGeneratedJarFilename.jar
結果是一樣的:
在 myGeneratedJarFilename.jar 中沒有主要清單屬性
我試過使用無效緩存並重新啟動幾次。 我已經閱讀了幾組關於 Jars、可執行 Jars 和 Java 類路徑的文檔,但我找不到錯誤。
Intellij Idea Community 2020.2
。java -version
,我看到openjdk version "14.0.2" 2020-07-14
。任何人都可以就可能出現的問題提供任何想法嗎?
非常感謝!
問題是我使用 InteliJ Idea 構建過程來構建一個胖 jar,IntelliJ Idea 不支持它。
為了讓它工作,我更新了我的 pom 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>myPackage</groupId>
<artifactId>myClass</artifactId>
<version>1.0-SNAPSHOT</version>
<name>myClass</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>hortonworks</id>
<name>hortonworks</name>
<url>https://repo.hortonworks.com/content/repositories/releases/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-common -->
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.3.2.6.2.0-205</version>
</dependency>
<dependency>
<!-- https://mvnrepository.com/artifact/org.apache.hive/hive-exec -->
<groupId>org.apache.hive</groupId>
<artifactId>hive-exec</artifactId>
<version>1.2.1000.2.6.2.69-1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>myPackage.myClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
然后我必須打開 Maven 窗口(視圖-> 工具窗口-> Maven)並使用 Maven 任務clean
然后compile
然后package
,並按預期創建 jars。
筆記:
src/main/resources/META-INF/MANIFEST.MF
。感謝 y.bedrov 在讓我理解為什么它不起作用時的明確答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.