[英]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.