簡體   English   中英

Intellij Executable Jar - 沒有主清單屬性 Vs 無法找到或加載主類

[英]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工件的方式是:

  • 項目結構 -> 工件
  • 點擊 + -> Jar -> From modules with dependencies
  • 我選擇主類作為界面建議
  • 選項“提取到目標 Jar”
  • 我目前在src/main (完整路徑)中設置了META-INF/MANIFEST.MF Manifest 目錄
  • 在接下來的窗口中,我會在左側看到項目的所有依賴項。 在列表的底部,它說myPackage compile output

在應用和確定之后,我生成了 jar 文件,正如我所期望的那樣,在 jar 根目錄中有META-INF/MANIFEST.MFmyPackage/myClass ,以及所有其他依賴項。 但是,當我嘗試通過以下方式運行 jar 時:

  • cd到 jar 的位置並使用java -jar myGeneratedJarFilename.jar
  • 將 intellij idea 運行/調試配置與“應用程序”或“運行 jar 應用程序”一起使用

結果是一樣的:

在 myGeneratedJarFilename.jar 中沒有主要清單屬性

我試過使用無效緩存並重新啟動幾次。 我已經閱讀了幾組關於 Jars、可執行 Jars 和 Java 類路徑的文檔,但我找不到錯誤。

  • 我在 Arch Linux 上使用Intellij Idea Community 2020.2
  • 在終端上輸入java -version ,我看到openjdk version "14.0.2" 2020-07-14
  • 清單文件中的類路徑對我來說有點神秘。 文檔說這是一個相對路徑,但相對於我不確定的路徑。 專業人士對此的任何澄清都會很好!
  • 項目結構是使用 org.apache.maven quickstark 原型制作的

任何人都可以就可能出現的問題提供任何想法嗎?

非常感謝!

問題是我使用 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。

筆記:

  • 在我的工作結構中, MANIFEST.MF 位於src/main/resources/META-INF/MANIFEST.MF
  • 我沒有使用任何 IntelliJ 項目結構 Artifacts 操作來獲取工作的胖罐子。 即使您創建了 Maven 項目,這些也不使用 Maven。

感謝 y.bedrov 在讓我理解為什么它不起作用時的明確答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM