【问题标题】:Maven - Executable file from a java projectMaven - 来自 java 项目的可执行文件
【发布时间】:2023-04-08 04:32:01
【问题描述】:

我需要使用 maven(用于学校项目)从单个 maven 命令创建可执行文件。我从未使用过 maven 并在 stackoverlow 上尝试了许多解决方案。解决方案创建了一个 jar 文件,但该文件从未打开。

这是我的项目结构

src
    com
        project
                code
                       swing
                             programm
                                      interface
                                               Main.class

我知道这不是 maven 约定,但是现在更改它意味着我必须为大约 40 个类调整导入(因为 intelliJ 不能完美地重构所有内容)。

<?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>

我必须在里面放什么来制作可执行文件?

【问题讨论】:

  • executable 中的意思是平台特定的二进制文件或 jar 文件,可以使用 PC 上安装的 JVM 执行?
  • 因为 intelliJ 不能完美地重构所有东西”你为什么这么说?我没有遇到过这个问题……基本上,我用过的任何 IDE 都没有。
  • 按照maven默认约定java源应该放在src/main/java
  • @NeplatnyUdaj 通过可执行文件我的意思是一个 jar 文件,应该澄清这一点。在:VLAZ 我通常也从未遇到过重构问题,但是,这一次它不起作用。不知道为什么...

标签: java maven pom.xml executable-jar


【解决方案1】:

TimurJD 的回答是正确的,但是我想逐步解释实际发生的情况以及原因。

  • 要让 jar 可执行,JVM 需要知道您的 main 方法在哪里。

  • 为此,您需要在您创建的 jar 中创建一个名为 META-INF/MANIFEST.MF 的文件。

  • 此文件必须包含对包含 main 方法的类的引用,方法如下:

     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 中拥有插件后,只需从 IDE 或命令行运行 maven install 目标即可。在您的项目中找到一个名为target 的文件夹之后。该文件夹将包含可执行 jar。

  • 要运行 jar,您可以从命令行调用:

    java -jar MyProject.jar
    

还应注意,除非您遵守将源代码保存在 src/main/java 中的 maven 标准,否则您必须明确指定您的源文件夹。

【讨论】:

    【解决方案2】:

    您需要将插件添加到您的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的链接

    可能有不同的解决方案,取决于您的要求:https://www.baeldung.com/executable-jar-with-maven

    【讨论】:

    • 我收到了 java.lang.ClassNotFoundException。尝试用norbert的想法执行文件,也给了我找不到主类的错误信息
    • 我已经找到了解决方案。我将 添加到我的构建中。现在我收到了似乎与此无关的新错误。
    • @Yoey 您可以分享错误,也许有人会帮助解决它
    猜你喜欢
    • 1970-01-01
    • 2022-11-07
    • 2018-07-05
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多