Maven - 来自 java 项目的可执行文件
Maven - Executable file from a java project
我需要使用 maven(用于学校项目)从单个 maven 命令创建可执行文件。我从未使用过 Maven,并在 stackoverlow 上尝试过许多解决方案。解决方案创建了一个 jar 文件,但该文件从未打开。
这是我的项目结构
src
com
project
code
swing
programm
interface
Main.class
我知道这不是 maven 约定,但是现在更改它意味着我将不得不调整导入(因为 intelliJ 不能完美地重构所有内容)大约 40 类.
<?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>MyGroup</groupId>
<artifactId>myProgramm</artifactId>
<version>0.7-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Hello World</name>
<description>Course Project</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.25.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit/junit5-engine -->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit5-engine</artifactId>
<version>5.0.0-ALPHA</version>
</dependency>
</dependencies>
<build>
</build>
制作可执行文件需要在里面放什么?
您需要将插件添加到您的 pom.xml
文件
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>com.example.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
和 运行 程序:mvn clean install exec:java
...这是文档 http://www.mojohaus.org/exec-maven-plugin/usage.html
的 link
可能有不同的解决方案,具体取决于您的要求:https://www.baeldung.com/executable-jar-with-maven
TimurJD 的回答是正确的,但我想逐步解释实际发生的情况以及原因。
要使 jar 可执行,JVM 需要知道您的 main
方法在哪里。
为此,您需要在您创建的 jar 中创建一个名为 META-INF/MANIFEST.MF 的文件。
此文件必须包含对包含您的 main
方法的 class 的引用:
Main-Class: com.example.ClassContainingMainMethod
创建上述文件的方法有很多种,但由于您使用的是 maven,因此这里有一个插件可以帮助您创建此清单文件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.1</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.my.packege.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
一旦你在你的 pom.xml
中有了插件,只需 运行 maven install
目标,从你的 IDE 或命令行。在您应该在项目中找到一个名为 target
的文件夹之后。该文件夹将包含可执行文件 jar。
到运行你可以从命令行调用的jar:
java -jar MyProject.jar
还应注意,除非您遵守将源代码保存在 src/main/java
中的 Maven 标准,否则您必须明确指定源文件夹。
我需要使用 maven(用于学校项目)从单个 maven 命令创建可执行文件。我从未使用过 Maven,并在 stackoverlow 上尝试过许多解决方案。解决方案创建了一个 jar 文件,但该文件从未打开。
这是我的项目结构
src
com
project
code
swing
programm
interface
Main.class
我知道这不是 maven 约定,但是现在更改它意味着我将不得不调整导入(因为 intelliJ 不能完美地重构所有内容)大约 40 类.
<?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>MyGroup</groupId>
<artifactId>myProgramm</artifactId>
<version>0.7-SNAPSHOT</version>
<packaging>jar</packaging>
<name>Hello World</name>
<description>Course Project</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.25.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit/junit5-engine -->
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit5-engine</artifactId>
<version>5.0.0-ALPHA</version>
</dependency>
</dependencies>
<build>
</build>
制作可执行文件需要在里面放什么?
您需要将插件添加到您的 pom.xml
文件
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>com.example.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
和 运行 程序:mvn clean install exec:java
...这是文档 http://www.mojohaus.org/exec-maven-plugin/usage.html
的 link可能有不同的解决方案,具体取决于您的要求:https://www.baeldung.com/executable-jar-with-maven
TimurJD 的回答是正确的,但我想逐步解释实际发生的情况以及原因。
要使 jar 可执行,JVM 需要知道您的
main
方法在哪里。为此,您需要在您创建的 jar 中创建一个名为 META-INF/MANIFEST.MF 的文件。
此文件必须包含对包含您的
main
方法的 class 的引用:Main-Class: com.example.ClassContainingMainMethod
创建上述文件的方法有很多种,但由于您使用的是 maven,因此这里有一个插件可以帮助您创建此清单文件
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.1</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.my.packege.Main</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build>
一旦你在你的
pom.xml
中有了插件,只需 运行 maveninstall
目标,从你的 IDE 或命令行。在您应该在项目中找到一个名为target
的文件夹之后。该文件夹将包含可执行文件 jar。到运行你可以从命令行调用的jar:
java -jar MyProject.jar
还应注意,除非您遵守将源代码保存在 src/main/java
中的 Maven 标准,否则您必须明确指定源文件夹。