聚合maven+spring-boot打包可执行jar

整整搞了一天,终于解决这个问题了。这里是四个module,module之间存在依赖,打包两个可执行jar,看下最终效果吧

聚合maven+spring-boot的搭建很简单,和普通的聚合maven没有什么区别。聚合maven+spring-boot打包成可执行jar就不是那么容易了,主要是因为spring-boot的坑有点多啊。普通聚合maven打包我就不说了。就说说和spring-boot一起打包的那些比较大的坑吧。

一、spring-boot-maven-plugin打包出来的jar是不可依赖的

比如我有一个root工程,type为pom,下面两个spring-boot工程作为它的module,分别为moduleA和moduleB。假如moduleA依赖于moduleB。如果你在moduleB中使用了spring-boot-maven-plugin的默认配置build,或者在root中使用spring-boot-maven-plugin的默认配置build。很遗憾,你在clean package的时候会发现moduleA找不到moduleB中的类。原因就是默认打包出来的jar是不可依赖的。

解决方案:

1、调整你的代码,把spring-boot的东西从moduleB中移走。官方文档是这样说的,但是大部分人不会

这么干吧。

2、官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个jar包,一个用来直接执

行,一个用来依赖。于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。比

如我设置<classifier>exec</classifier>,原项目名为Vehicle-business。

那么我会得到两个jar:Vehicle-business.jar和Vehicle-bussiness-exec.jar

官方文档位置:84.5 Use a Spring Boot application as a dependency

总结:回到聚合maven上,如果你在root工程中使用了spring-boot-maven-plugin作为builder,那么你的依赖module一定要用解决方案二来设置。否则你不在root工程中用spring-boot-maven-plugin作为builder,而在需要打包的module上使用。

二、jdk8一定要指明

不指明的话在开发工具里运行没有一点问题,如果你没有用到java8的特性打包也没有问题。一旦你用到了java8的特性,而且使用spring-boot-maven-plugin作为builder,一定要指明jdk版本。不然你会收到类似不识别Lambda,请使用resource8这样的错误。

 <properties>
    <java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

三、BOOT-INF陷阱
          这个问题就很恶心了。这个时候你已经打包成功,你会发现运行jar的时候报错为file not found,而且不告诉你是什么文件。你打开jar去看,发现需要的lib,配置文件,class一样也不缺。

其实这里要说一个概念,spring-boot在打包后,会把文件拷贝到BOOT-INF/Classes之下,这个时候你原来定义的扫描包路径将失效。而这个问题官方文档根本没讲,还是我没有看到。

这个陷阱在你使用packages定义扫描路径的时候等着你。或者获取工程下文件的时候。对于获取文件的话,可以在原路径前加上classes,当然你要区分开发环境或生产环境的话,你可以使用profile或者conditional来解决。如果是扫描包路径就恶心了,因为你加上classes之后,不报file not found了。而是不报错,只是警告你找不到hibernate的某些xml。但是你很可能根本没有使用hibernate。

目前我的解法是使用register方法代替packages方法,但是问题就是,如果你的类很多,那将是一件痛苦的事情。还好我这里只需要配置两个基于jersey的公共类。

顺便吐槽一下官方文档在配置jersey的时候根本没有提到packages方法,自然也就把这个BOOT-INF陷阱给忽略了。官方关于jersey的配置章节为27.2 JAX-RS and Jersey

最后、举个例子。

假设工程结构如下

parent

moduleA

moduleB

moduleC

其中moduleB被moduleA依赖,A使用jersey,moduleA和moduleC需要打包为可执行jar

那么我们有两种方式聚合

方式一 在parent中指定spring-boot-maven-plugin

parent的pom.xml中的builder

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
             <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

moduleB的pom.xml中的builder

 <build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
    </plugins>
</build>

其余工程不需要builder

方法二

parent的pom.xml不提供builder

moduleA和moduleC的pom.xml中的builder

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
             <configuration>
                  <source>1.8</source>
                  <target>1.8</target>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
  </build>

最后,两种方法都需要把jersey配置文件中的packages方法换成register方法

public class JerseyConfig extends ResourceConfig{
    public JerseyConfig() {
       register(RequestContextFilter.class);
       //配置restful package.
       //packages("com.zs.vehicle.rpc");
       //packages("classes/com/zs/vehicle/rpc");
       register(Base.class);
       register(Route.class);
    }
}

原文地址:https://www.cnblogs.com/zhujiabin/p/9842403.html

时间: 2024-08-05 04:35:08

聚合maven+spring-boot打包可执行jar的相关文章

Spring Boot 打包分离依赖 JAR 和配置文件

1 <properties> 2 <java.version>1.8</java.version> 3 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 4 <!--自定义路径--> 5 <directory>c:/makeCode/${name}/</directory> 6 <!--跳过检查--> 7 <s

Spring Boot打包部署修改jar文件名

只需要在pom.xml的<build>标签中加上这个即可: 1 <build> 2 <finalName>my-spring-boot</finalName> <!-- 指定package生成的文件名为my-spring-boot.jar --> 3 4 <plugins> 5 ...... 6 </plugins> 7 </build> 原文地址:https://www.cnblogs.com/import-

spring/boot 打包,资源/配置/业务文件分离

spring/boot打包,将业务jar包和资源配置文件进行分离打包,打包后的资源在target/release文件夹下面 注意:添加以下配置后,注意修改自己的入口类 <!--相关编译打包依赖--> <build> <plugins> <!--打包jar--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-p

maven项目用assembly打包可执行jar包

该方法只可打包非spring项目的可执行jar包,spring项目可参考:http://www.cnblogs.com/guazi/p/6789679.html 1.添加maven插件: <!-- Maven Assembly Plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactI

spring boot打包以及centos下部署

spring boot打包以及部署 一.打包 springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成jar进行部署.不推荐用war,因为springboot适合前后端分离,打成jar进行部署更合适. 需要在pom.xml中增加主程序入口 <build> <plugins> <plugin> <groupId>org.springframework.boot<

Spring Boot Maven 打包可执行Jar文件!

Maven pom.xml 必须包含 [plain] view plain copy <packaging>jar</packaging> [html] view plain copy <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</ar

Spring Boot Maven 打包可执行Jar文件

本文转载自:http://blog.csdn.net/smilecall/article/details/56288972 Maven pom.xml 必须包含 <packaging>jar</packaging> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-mave

Vcenter数据采集之maven打包可执行jar血历史

技术点:spring加载xsd过程: http://blog.csdn.net/bluishglc/article/details/7596118 案发背景: 1.一个使用maven管理的普通项目(vcenter-collector :关于Vcenter数据采集) 2.项目主要技术: java + mybatis(基于接口形式)+其他 3.项目中有一个非maven仓库的jar包:vijava(做vcenter数据采集的),在项目中以system方式引用 (该jar放在${project.base

maven 打包可执行jar 问题小结

最近项目用到maven,完成后要将项目打包成可执行的jar,在网上搜了很多打包方法,但总有个个别问题在那里 pom配置文件增加下面配置,执行mvn clean package <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configur