关于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 文件的问题的更多相关文章

  1. maven打包 tomcat运行pom配置 或 打成jar包

    maven打包 tomcat运行pom配置,同时还需要配置org.apache.tomcat.maven插件,这里省略. <groupId>com.company</groupId& ...

  2. maven: 打包可运行的jar包(java application)及依赖项处理

    IDE环境中,可以直接用exec-maven-plugin插件来运行java application,类似下面这样: <plugin> <groupId>org.codehau ...

  3. 关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10

    关于 调用 JNI JAR 的说明和注意事项,调用第三方 JAR SDK 和 翻译 安卓 JAVA 代码 的说明 V2015.6.10 转载请标明出处,否则死全家.选择[复制链接]即可得到出处. (* ...

  4. Maven 打包可运行 jar

    为配合自动化部署hudson,最近研究了如何将eclipse maven工程打包成可运行的jar函数及对应的资源文件.      由于我们工程中包含了多个可运行的任务,在打包成jar时需要分别导出,p ...

  5. spring boot maven打包可运行jar包

    普通打包之后在程序目录运行,或者编写bat运行时会提示“没有主清单属性”,这是因为并没有找到main()方法,需要我们指明告诉java程序 我bat中的代码 @echo off title mytit ...

  6. maven 打包可运行jar包(转)

    目录 1.前提 2.方法一:使用maven-jar-plugin和maven-dependency-plugin插件打包 3.方法二:使用maven-assembly-plugin插件打包 4.方法三 ...

  7. 使用Maven打包可运行jar和javaagent.jar的区别

    简介 javaagent 是 Java1.5 之后引入的新特性,其主要作用是在class被加载之前对其拦截,以插入我们的字节码. java1.5 之前使用的是JVMTI(jvm tool interf ...

  8. maven打包可运行的jar包(包含依赖工程)

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  9. 利用MAVEN打包可运行jar包,包括依赖的第三方包

    转载自:http://bglmmz.iteye.com/blog/2058914 背景: 另一篇文章说了如何利用IDEA来打包,现在来说说如何利用MAVEN打包 目标:应用本身打成一个jar包,依赖的 ...

随机推荐

  1. struts2下velocity做视图如何访问request,session等内置对象,如:原来webwork的$req

    struts2下velocity做视图如何访问request,session等内置对象(转) velocity 内置对象 struts2 requestStruts2环境下用velocity做视图时访 ...

  2. windows 下mongodb 副本建创建

    步骤: 一.安装mongodb 二.将安装的mongodb 复制2份 如图: 三.修改配置文件 dbpath=C:\mongofuben\zhu\data logpath=C:\mongofuben\ ...

  3. Appium之手机屏幕亮度控制条处理

    手机设置下的屏幕亮度控制条看上去是悬浮的,想手动调整亮度有两种方法:一.在控制条上左右任意拖动:二.在控制条上点击任意一点.如下图:

  4. tomcat下manager配置

    1 安装Tomcat前需要先安装JDK.安装Tomcat后测试Tomcat成功安装. Tomcat Manager是Tomcat自带的.用于对Tomcat自身以及部署在Tomcat上的应用进行管理的w ...

  5. 两段 PHP 代码比较优劣

    // 代码一 public function getPCA($level = false) { $results = array(); $where = $level ? " where f ...

  6. [javascript]两段 javaScript 代码的逻辑比较

    两段 javaScript 代码的逻辑比较: #1 if(tagName.length < 3){    $(this).parent().addClass('active');    tagN ...

  7. CAS实战の自定义登录

    由于每个版本的改动较大,所以先把版本号列出: 服务端版本:cas server 4.0.0 客户端版本:cas client 3.3.3 一.自定义登录页面 页面路径:/WebContent/WEB- ...

  8. Java反射API研究(1)——注解Annotation

    注解在表面上的意思,只是标记一下这一部分,最好的注解就是代码自身.而在java上,由于注解的特殊性,可以通过反射API获取,这种特性使得注解被广泛应用于各大框架,用于配置内容,代替xml文件配置. 要 ...

  9. ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便

    初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着“高内聚.低耦合”的原则, ...

  10. Tempdb--monitoring and troubleshooting

    TempDB用来存放临时表.全局临时表.表变量以及排序或HASH等操作引发的中间结果集 TempDB在每次实例重启时重新创建,TempDB数据库文件的初始化大小取决于Model数据库的文件大小或显示A ...