繁体   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