springboot maven 多模块引用不到依赖的类

Submitted by Lizhe on Fri, 03/23/2018 - 10:52

记录一个碰到的古怪问题

现象是, 我在使用springboot作为框架时, 使用了多个maven的子模块, 当开启eclipse的auto build时没有问题

怀疑是eclipse自己对项目进行了build,然后把class放在了正确的位置

当关闭了eclipse的build转为仅仅使用maven install命令时会提示找不到对应的自定义类

就是说A模块先install之后, B模块将A放入自己依赖描述, 然后引用A模块定义的class, 编译失败提示找不到

root cause 在于我使用了

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>

从springboot1.4 开始, springboot plugin打包的jar会将classes文件放入

一个名为BOOT-INF的文件夹而不是jar包的根路径 例如 C:\ttt\lira-user-0.0.1-SNAPSHOT\BOOT-INF\classes

这就导致了其他模块在引用这种结构的jar文件时找不到对应的类

解决方案是将layout改成module, 就会变回根路径了

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <mainClass>name.lizhe.lira.app.Application</mainClass>
                    <layout>MODULE</layout>
                </configuration> 
                <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
                    </goals>
                    <!--可以生成不含依赖包的不可执行Jar包-->
                    <!-- configuration>
                      <classifier>exec</classifier>
                    </configuration> -->
                </execution>
            </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
    </build>