导入本地项目作为依赖项时无法编译Maven

时间:2020-01-30 08:11:46

标签: java spring maven intellij-idea compilation

我正在创建一个通用库,该库将在多个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
  • 您是否知道为什么我无法同时使用maven编译项目 我可以将其作为Spring应用程序启动吗?

这是我在 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>

2 个答案:

答案 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

相关问题