关于 maven 打包直接运行的 fat jar (uber jar) 时需要包含本地文件系统第三方 jar 文件的问题
关于maven打包fat jar (uber jar) 时需要包含本地文件系统第三方jar文件的问题,今天折腾了一整天。最后还是用了spring boot来做。下面是几篇关于打包的有参考价值的文章,以及我的解决方法。
参考文章:
1. 将 Spring boot 项目打成可执行Jar包,及相关注意事项(main-class、缺少 xsd、重复打包依赖) https://blog.csdn.net/rainbow702/article/details/55096506
2. Java 打包 FatJar 方法小结 https://yq.aliyun.com/articles/631100
(此文说明了Unshaded,Shaded 和 jar of jars 的区别和方法,其中提到了 jar of jars 的工具有 Onejar Maven Plugin 和 下面的 spring boot plugin)
3. maven打包可运行的fat-jar的简单方法 https://www.cnblogs.com/pekkle/p/9680769.html
(此处两种方法均无法包含本地jar,下面就是关于如何在第二种方法中加入本地jar的选项。对于assembly,或者maven shade插件,我都还搞不清楚如何把本地jar包进去,或者包进去后如何被查找到。有知道的同学麻烦留言告知,不胜感激!)
4. (20191101 新增) maven-shade-plugin介绍及使用 https://blog.csdn.net/yangguosb/article/details/80619481
我采用的方法:
最后的pom.xml文件,其中的gson是测试maven repo的依赖,mxGraph是测试本地jar文件的依赖 :
<?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>com.pekkle</groupId>
<artifactId>test-maven</artifactId>
<version>1.0-SNAPSHOT</version> <name>${artifactId}</name> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies> <!--这个是maven repo中的dependency-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency> <!--这个是本地文件系统中的dependency,groupId和artifactId和version其实都是可以自己随便编一个的-->
<!--systemPath就是指向本地jar文件,${basedir}指向pom.xml文件所在的目录-->
<dependency>
<groupId>com.jgraph</groupId>
<artifactId>abctest</artifactId>
<version>3.9.11</version>
<scope>system</scope>
<systemPath>${basedir}/src/lib/mxgraph-all.jar</systemPath>
</dependency> </dependencies> <build>
<finalName>${artifactId}</finalName> <plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<!--自己写的应用的主类-->
<mainClass>com.pekkle.App</mainClass>
<!--能包含本地文件系统的jar包的关键-->
<includeSystemScope>true</includeSystemScope>
</configuration>
<executions>
<execution>
<goals>
<!--必须repackage才会生成最终的fat jar-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
生成的jar最后直接运行: java -jar ./target/test-maven.jar , 没有其他依赖。
总结:
本地文件的scope “system” 是被反对使用的,因为这样的文件是游离在maven repo之外。虽然可以通过安装到内网的Nexus仓库,或者安装到本机的repo仓库来提供依赖坐标,但是对于偶尔需要用到第三方jar,又需要整合到mvn package过程的需求来说,似乎还是需要这样一条路径。
关于 maven 打包直接运行的 fat jar (uber jar) 时需要包含本地文件系统第三方 jar 文件的问题的更多相关文章
- maven打包 tomcat运行pom配置 或 打成jar包
maven打包 tomcat运行pom配置,同时还需要配置org.apache.tomcat.maven插件,这里省略. <groupId>com.company</groupId& ...
- maven: 打包可运行的jar包(java application)及依赖项处理
IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: <plugin> <groupId>org.codehau ...
- 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10
关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...
- Maven 打包可运行 jar
为配合自动化部署hudson,最近研究了如何将eclipse maven工程打包成可运行的jar函数及对应的资源文件. 由于我们工程中包含了多个可运行的任务,在打包成jar时需要分别导出,p ...
- spring boot maven打包可运行jar包
普通打包之后在程序目录运行,或者编写bat运行时会提示“没有主清单属性”,这是因为并没有找到main()方法,需要我们指明告诉java程序 我bat中的代码 @echo off title mytit ...
- maven 打包可运行jar包(转)
目录 1.前提 2.方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包 3.方法二:使用maven-assembly-plugin插件打包 4.方法三 ...
- 使用Maven打包可运行jar和javaagent.jar的区别
简介 javaagent 是 Java1.5 之后引入的新特性,其主要作用是在class被加载之前对其拦截,以插入我们的字节码. java1.5 之前使用的是JVMTI(jvm tool interf ...
- maven打包可运行的jar包(包含依赖工程)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 利用MAVEN打包可运行jar包,包括依赖的第三方包
转载自:http://bglmmz.iteye.com/blog/2058914 背景: 另一篇文章说了如何利用IDEA来打包,现在来说说如何利用MAVEN打包 目标:应用本身打成一个jar包,依赖的 ...
随机推荐
- JAVA定时关机小程序
大一刚学java时候做的小程序.由于当时迅雷还没有下载完成关机,晚上要下很多学习资料.只有自己算时间然后通过shutdown命令设置时间关机. 当时通过shutwodn命令,想到能否通过java做一个 ...
- 【原创】请避免GO语言中的携程空跑(CPU突然激增)
其实GO语言从1.6版本开始非常不错了,GC性能优化非常到位,并且各种并行设计比从新实现一套C++版本的确是方便不少. 语言包也很多,库也相对稳定,完全可以适用于生产环境. 本文主要是给刚刚入门新手注 ...
- C# Redis Server分布式缓存编程(二)(转)
出处;http://www.cnblogs.com/davidgu/p/3263485.html 在Redis编程中, 实体和集合类型则更加有趣和实用 namespace Zeus.Cache.Red ...
- [转]How do I run msbuild from the command line using Windows SDK 7.1?
本文转自:http://stackoverflow.com/questions/6319274/how-do-i-run-msbuild-from-the-command-line-using-win ...
- [Erlang21]Erlang性能分析工具eprof fporf的应用
前段时间项目改代码突然cpu波动很大,排查了好久都没有找到原因,只能求助于性能测试工具 : <<Erlang程序设计>>----Joe Armstorng[哈哈,登月第一人 ...
- 离线下载解决Nuget程序包及其依赖包的方法
由于使用的一台电脑没有联网,但是需要asp.net core项目时使用到一个package,于是在nuget.org上手动下载.但是最后发现,依赖的包实在太多,手动下载太费时.于是晚上花时间研究了一下 ...
- DS作业01--日期抽象数据类型设计与实现
第六次作业 1.思维导图及学习体会 1.1 思维导图 1.2 学习体会 因为假期里面代码的练习量很小,所以开学来上学期的知识遗忘了很多,刚刚开始写大作业的时候很困难,完全没有思路,后来看了几位同学的代 ...
- Linux下MySQL数据库的备份与还原
昨天对公司数据库进行备份.用了以下的方法一. 导出1.导出数据和表结构: mysqldump -u用户名 -p密码 数据库名 > 数据库名.sql 如果要导出数据库全部: mysqldump - ...
- linux进程管理(二)
接上[linux进程管理(一)] 终止进程的工具 kill .killall.pkill 终止一个进程或终止一个正在运行的程序,一般是通过 kill .killall.pkill.xkill 等进行. ...
- php—Smarty-1 (18)
smarty 一.模板原理 1. 为什么使用模板 1) 场景: ;$i<$count;$i++){ echo ‘<td>’.$row[‘proname’].’</td> ...