我正在创建一个通用库,该库将在多个Spring应用程序中使用。我将要在这些应用程序之间共享的通用类提取到名为“ Common”的新Spring应用程序中。我在此应用程序上使用过mvn install
并将其放置在本地maven存储库中。在我的主项目中,我在 pom.xml 中添加了具有相同版本的Maven依赖项。
现在,如果我尝试在主项目中启动mvn compile
,则会出现此错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project recruitment: Compilation failure: Compilation failure:
[ERROR] /D:/[...]/application/src/main/java/com/example/application/service/Service.java:[8,37] package com.example.common.exception does not exist
表明我的公共库不存在,因此我的应用程序找不到来自它的软件包。
如果我尝试从主系统(使用Spring Boot)启动Spring应用程序,它会完美启动并表现出与以前相同的作用。
我在Windows上使用IntelliJ,默认情况下maven与IntelliJ捆绑在一起。如果我在本地Maven存储库中签入,则可以找到公共库jar。 IntelliJ不会对我的导入显示任何错误,它可以识别我的库。
IntelliJ和maven使用相同的 pom.xml 来读取为我的应用程序导入的库,这似乎与IntelliJ之间存在一些冲突。编译我的代码。
我使用mvn compile -X
来获取更多信息,有趣的是,maven正在使用本地存储库中的公共库jar:
[INFO] Changes detected - recompiling the module!
[DEBUG] Classpath:
[DEBUG] D:\[...]\application\target\classes
[DEBUG] C:\[...]\.m2\repository\com\example\common\0.0.1\common-0.0.1.jar
这是我在 pom.xml 中的依赖项:
<dependency>
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>0.0.1</version>
<scope>compile</scope>
</dependency>
以及公共库定义:
<groupId>com.example</groupId>
<artifactId>common</artifactId>
<version>0.0.1</version>
<name>common</name>
<description>Common project with generic technical modules</description>
答案 0 :(得分:0)
好吧,这很令人尴尬...我刚刚找到了解决方案!寻找这种棘手情况的解决方案已经过了两天,我才发现缺少的东西,或者说太多了。
这个坏男孩:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
Spring boot maven插件使我的Spring Boot应用程序可以从maven启动,并且似乎影响了通用jar库的创建或导入方式。
我不太清楚为什么它会影响我的导入,但是我在公用库 pom.xml 中删除了上面的插件,然后将其重新安装在本地存储库中并启动{{1} }再次在我的主应用程序上...现在可以使用了!
我认为通过Spring Boot启动使用了Spring Boot魔术,使Maven缺少这种方法。
如果有人能更好地理解它并能解释它,那将是很棒的,我认为是可以接受的答案。
答案 1 :(得分:0)
这样做的原因是,应用程序类打包在BOOT-INF / classes中,以便从属模块无法加载重新打包的jar的类
正确的配置如下:
<project>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.1.RELEASE</version>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>exec</classifier>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
来自
https://docs.spring.io/spring-boot/docs/current/maven-plugin/reference/html/#repackage-examples