Java 如何从包中生成jar文件?
我有以下项目,我正在尝试从中生成jar文件 我尝试了很多方法,但无法正确生成jar文件,我认为问题在于文件夹结构,我还必须将.xlsx作为程序的一部分。 当我尝试清理和构建它时,它会生成.jar文件,但当我尝试运行它时,我会得到一个错误 我还尝试在Manifest.txt中手动指定主类并编译它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
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就不再为您管理依赖项了
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上,使用:
代码>
...
<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