Java 如何从包中生成jar文件?

Java 如何从包中生成jar文件?,java,maven,Java,Maven,我有以下项目,我正在尝试从中生成jar文件 我尝试了很多方法,但无法正确生成jar文件,我认为问题在于文件夹结构,我还必须将.xlsx作为程序的一部分。 当我尝试清理和构建它时,它会生成.jar文件,但当我尝试运行它时,我会得到一个错误 我还尝试在Manifest.txt中手动指定主类并编译它 Error: Could not find or load main class NewJFrame Caused by: java.lang.ClassNotFoundException: NewJF

我有以下项目,我正在尝试从中生成jar文件

我尝试了很多方法,但无法正确生成jar文件,我认为问题在于文件夹结构,我还必须将.xlsx作为程序的一部分。 当我尝试清理和构建它时,它会生成.jar文件,但当我尝试运行它时,我会得到一个错误 我还尝试在Manifest.txt中手动指定主类并编译它

Error: Could not find or load main class NewJFrame
Caused by: java.lang.ClassNotFoundException: NewJFrame
我应该遵循哪些正确步骤? 我提到“NewJFrame”是一个包含main的类

pom结构为:


将其添加到pom文件中。您将拥有一个far jar,其中包含您需要的所有依赖项和所有内容

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.1</version>

            <configuration>
                <archive>
                  <manifest>
                     <mainClass>fully.qualified.MainClass</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>

org.apache.maven.plugins
maven汇编插件
3.1.1
完全合格
带有依赖项的jar
组装
包裹
单一的

不幸的是,这并不像听起来那么容易。。。要运行Jar,您需要:

  • 您要运行的罐子。在您的例子中,这是从IDE命令生成的Jar
  • 包含所有依赖项的类路径。通常,这些依赖项由IDE管理,这就是为什么可以使用IDE运行应用程序的原因。但是,当您以Maven为例生成一个JAR时,您的IDE就不再为您管理依赖项了
假设您有一个使用Maven的基本应用程序,没有依赖项,您可以执行以下操作:

package com.stackoverflow.test;
public class Main {

    public static void main(String[] args) {
        System.out.println("Hello World !");
    }
}
然后,要生成JAR,您需要运行
manpackage
。要运行它,请执行以下操作(不需要清单文件):

在这里,您可以看到“-cp”选项,它指示JVM加载一个JAR,在我们的例子中,它位于target中,名为myApp.JAR,并在类
com.stackoverflow.test.main
中执行main方法

简单,对吗

但是,当你开始有依赖关系时,事情就变得更复杂了。在下面的示例中,我将假设我与一个著名的库有依赖关系。我将相应地更新我的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>org.example</groupId>
    <artifactId>launchJar</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
    </dependencies>


</project>
生成Jar(
mvn包
)并执行与前面相同的命令后,我发现您的错误:

java -cp target/myApp.jar com.stackoverflow.test.Main
线程“main”java.lang.NoClassDefFoundError:org/apache/commons/lang3/StringUtils中的异常位于com.stackoverflow.test.main.main(main.java:8)
原因:java.lang.ClassNotFoundException:org.apache.commons.lang3.StringUtils
位于java.net.URLClassLoader.findClass(URLClassLoader.java:382)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:418)
位于sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:351)
... 还有1个

让它工作的唯一方法是将我的新依赖项添加到类路径,以便运行应用程序。对于maven,在我的示例中,
commons-lang3
依赖项位于:
~/.m2/repository/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar

为了让我的应用程序运行,我执行:

java -cp ~/.m2/repository/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar:target/myApp.jar com.stackoverflow.test.Main
注:

  • 要运行应用程序,类路径顺序很重要(在我的Jar之前是commons lang)
  • 在Unix/Linux上,要分隔不同的JAR,字符为
    。在windows上,使用
但是,如果我有很多依赖项,我需要手动提供它们吗?幸运的是,没有

有了Maven,您可以使用一个新插件,它创建了一个所谓的“胖jar”或“带依赖项的jar”。为此,只需更新POM以添加新插件:

...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.1</version>

                <configuration>
                    <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>
...
您还可以自定义此插件,以自动添加MainClass并拥有一个“可运行的Jar”


如果您可以共享pom文件以及如何运行jar,这将非常有用。您可能需要创建一个far jar。即使创建了fat jar,您也可能会遇到一些问题,具体取决于加载文件的方式。@cool我添加了pom结构。当我尝试使用java-jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar运行它时,我得到以下错误:没有主清单属性,在mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar中,对不起,我忘记了归档部分。请更改pom以引入具有适当主类的蜂窝部件。我更新了上面的配置。
java -cp ~/.m2/repository/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar:target/myApp.jar com.stackoverflow.test.Main
...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.1</version>

                <configuration>
                    <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>
...
java -cp target/myApp-jar-with-dependencies.jar com.stackoverflow.test.Main
<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.1.1</version>

                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.stackoverflow.test.Main</mainClass>
                        </manifest>
                    </archive>
                </configuration>

                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>

            </plugin>
java -jar target/myApp-jar-with-dependencies.jar