背景:采用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>
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐