IDEA+Spring Cloud+Maven模块化项目打包的坑
背景:采用Spring Cloud框架搭建了一个项目,里面包含多个微服务,其中项目A依赖项目B,项目B里面是公共类。坑一:cmd命令——mvn package打包出错打包项目A的时候,用IDEA里面的maven插件打包没有问题,但是用cmd命令mvn package打包时报错,报错信息说找不到项目B里面的类。于是开始排查问题,私库和本地库上都有B的jar包,A的pom文件也有B的依赖,一切看...
背景:采用Spring Cloud框架搭建了一个项目,里面包含多个微服务,其中项目A依赖项目B,项目B里面是公共类。
坑一:cmd命令——mvn package打包出错
打包项目A的时候,用IDEA里面的maven插件打包没有问题,但是用cmd命令mvn package打包时报错,报错信息说找不到项目B里面的类。
于是开始排查问题,私库和本地库上都有B的jar包,A的pom文件也有B的依赖,一切看起来都很正常。最后网上查找了资料,原来是因为B项目pom文件里面引入了spring-boot-maven-plugin插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
这个SpringBoot插件会在Maven的package后进行二次打包,目的为了生成可执行jar包。正是因为产生了可执行jar包(与普通用于引用的jar包目录结构不同),所以A项目打包时就找不到B项目的类。
解决方法:B项目的pom文件中把上面的插件去掉,重新发布到私服,A项目就可以成功打包。
坑二:运行时报错,找不到本地引入的jar包
运行项目A的时候,报错找不到jdbc的驱动类,可是我的驱动包明明已经在pom文件里面本地引入了。把项目A打包的jar包打开查看,发现里面的本地引入的jar包都没有了。
网上查找了原因,原来又是上一个坑的那个spring-boot-maven-plugin插件的问题:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
要打包本地的jar包,spring-boot-maven-plugin需要加上这一行:
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
解决方法:在项目A的pom文件中,把spring-boot-maven-plugin改为:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
坑三:修改spring-boot-maven-plugin版本,访问jsp报错:404
修改了spring-boot-maven-plugin为2.0.4版本后,打包运行后发现原本可以访问的jsp变成无法访问。
原来,要想打包后能访问jsp,只能使用1.4.2.RELEASE版本的spring-boot-maven-plugin插件。
附上插件pom:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--必须是1.4.2版本,否则jsp无法访问-->
<version>1.4.2.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<!-- 打包时将jsp文件拷贝到META-INF目录下-->
<resource>
<!-- 指定resources插件处理哪个目录下的资源文件 -->
<directory>src/main/webapp</directory>
<!--注意此次必须要放在此目录下才能被访问到-->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
</build>
更多推荐
所有评论(0)