执行 Maven 编译的 jar,找不到相关的 依赖的类--使用 maven-assembly-plugin 解决

简介:

问题:执行 jar 找不到依赖的类

用 Maven 编译完成后 ,生产了 ui-compressor-1.0.0.jar, 此时执行

java -cp target/ui-compressor-1.0.0.jar com.waylau.uicompressor.App

提示下面找不到依赖的包:

Exception in thread "main" java.lang.NoClassDefFoundError: org/mozilla/javascrip
t/ErrorReporter
 at java.lang.Class.getDeclaredMethods0(Native Method)
 at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
 at java.lang.Class.getMethod0(Class.java:2685)
 at java.lang.Class.getMethod(Class.java:1620)
 at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:492)
 at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:484)

Caused by: java.lang.ClassNotFoundException: org.mozilla.javascript.ErrorReporte
r
 at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
 at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
 ... 6 more

解压 jar ,发现只有程序的主文件在,其他的依赖的包都不见,当然无法正常运行。

解决:使用 maven-assembly-plugin

在项目 pom.xml 中添加 maven-assembly-plugin:

<build> <!--使用Maven编译可执行的jar --> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <appendAssemblyId>false</appendAssemblyId> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.waylau.uicompressor.App</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>assembly</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 

其中,mainClass 是你的程序主入口文件

编译、安装依赖

mvn install 

执行:

java -cp target/ui-compressor-1.0.0.jar com.waylau.uicompressor.App

成功运行了

maven-assembly-plugin 介绍

什么是 maven-assembly-plugin

maven-assembly-plugin 插件主要是为了允许用户输出项目及其依赖关系、模块、网站文档和其他文件到一个单独的可发布的文档中。

目前支持发布的格式有:

  • zip
  • tar
  • tar.gz (or tgz)
  • tar.bz2 (or tbz2)
  • jar
  • dir
  • war
  • 及其他由 ArchiveManager 配置的任意格式

使用该插件只需三步:

  1. 选择或者写入要使用的 assembly descriptor,
  2. 配置 Assembly 插件到项目的 pom.xml,
  3. 项目中运行 "mvn assembly:single"

如何使用 maven-assembly-plugin

配置

将要使用 assembly descriptor 的,填入 <descriptorRefs>/<descriptorRef> 参数即可。如果使用自定义的 assembly descriptor 配置 你的 descriptor 路径到 <descriptors>/<descriptor> 参数。

注意装配的单个调用 Assembly 插件可以从多个 descriptor 产生 assembly,这样最大的灵活性允许您自定义项目的二进制文件项。

举例,现在项目要生产 JAR ,编译文件中要包含项目的依赖,配置如下:

<project>
 [...]
 <build>
 [...]
 <plugins> <plugin> <!-- NOTE: We don't need a groupId specification because the group is
 org.apache.maven.plugins ...which is assumed by default.
 --> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration>
 [...]
</project> 

注意 Assembly 插件允许你使用多个 descriptorRefs,产生不同的assembly.

另外,我们已经创建了一个自定义 descriptor 名字叫 src.xml 在 src/assembly ,可以这样使用:

<project>
 [...]
 <build>
 [...]
 <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.2</version> <configuration> <descriptors> <descriptor>src/assembly/src.xml</descriptor> </descriptors> </configuration>
 [...]
</project> 

编译 Assembly

single 目标绑定到项目的生命周期,配置如下

<project>
 [...]
 <build>
 [...]
 <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.2</version> <configuration> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <!-- this is used for inheritance merges --> <phase>package</phase> <!-- bind to the packaging phase --> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin>
 [...]
</project> 

打包:

mvn package 

当编译完成,target 目录下,生产了一个 jar

target/sample-1.0-SNAPSHOT-jar-with-dependencies.jar

高级配置

创建一个可执行的 JAR

一旦您创建了这个独立的 JAR,就可以通过 -jar 在 JVM 运行。

通过 mainClass 来配置 JAR 中的 Main-Class 属性:

<project>
 [...]
 <build>
 [...]
 <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.2</version> <configuration>
 [...]
 <archive> <manifest> <mainClass>org.sample.App</mainClass> </manifest> </archive> </configuration>
 [...]
 </plugin>
 [...]
</project> 

再次编译 META-INF/MANIFEST.MF 中可以看到

[...] Main-Class: org.sample.App 

注意只有 jar 和 war 的 assembly 格式支持<archive>配置

参考:

目录
相关文章
|
5天前
|
存储 安全 Java
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
14 4
2024ide构建maven项目是总是卡在解析Maven依赖项目 加速方案
|
8天前
|
Java Maven
Maven 引入外部依赖
在 Maven 项目中引入外部依赖,如 LDAP 帮助库 ldapjdk.jar,通常涉及将 jar 放入 `src/lib` 并在 `pom.xml` 添加系统依赖
|
9天前
|
Java 数据库连接 数据库
在Maven或者Gradle构建配置中添加了必要的依赖
在Maven或者Gradle构建配置中添加了必要的依赖
17 1
|
13天前
|
消息中间件 资源调度 Java
实时计算 Flink版产品使用问题之拉取代码没有这个类,但是在下载的jar包中有这个类,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
15天前
|
Java 测试技术 数据库连接
maven依赖详解
maven依赖详解
31 1
|
1天前
|
XML Java 数据库连接
技术笔记:Maven的pom.xml(坐标的gav、依赖的scope)
技术笔记:Maven的pom.xml(坐标的gav、依赖的scope)
|
1天前
|
Java 关系型数据库 MySQL
Maven如何快捷导入jar包
Maven如何快捷导入jar包
|
2天前
|
Java Maven
Maven 引入外部依赖
在 Maven 项目中引入外部库如 ldapjdk.jar,通常涉及将 jar 存放在 `src/lib` 并在 `pom.xml` 添加系统依赖。
|
2天前
|
SpringCloudAlibaba Java Maven
关于拆分boot工程的踩坑之maven多模块间的依赖关系处理
关于拆分boot工程的踩坑之maven多模块间的依赖关系处理
|
3天前
|
Java Maven
java运行jar包提示 “XXX中没有主清单属性”,配置maven插件
java运行jar包提示 “XXX中没有主清单属性”,配置maven插件
7 0

热门文章

最新文章

推荐镜像

更多