Enr*_*man 5 java pom.xml maven spring-boot spring-boot-maven-plugin
我有一个包含三个模块的项目:A、B 和 COMMON。我想将通用逻辑放入 COMMON 模块(例如模型)中,然后放入依赖于它的其他两个模块。
两个模块(A、B)将分别构建以创建两个不同的 jar。
我正在测试它,尝试将日志依赖项放入 COMMON 模块中,然后构建 A 项目。它将正确构建,但如果我尝试使用“java -jar a.jar”运行 jar,则会失败并显示 NoClassDefFound:
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
Run Code Online (Sandbox Code Playgroud)
根 pom:
<modules>
<module>common</module>
<module>a</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.3</version>
</dependency>
</dependencies>
</dependencyManagement>
Run Code Online (Sandbox Code Playgroud)
常见的pom:
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
和一个pom:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>bla.bla.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>bla.blu</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)
默认情况下,Maven 不会将所有依赖项打包到您的 JAR 中。因此它缺失了。当您运行它时,您应该在类路径上提供该 jar。
另一种选择是创建所谓的 fat jar。这是SO线程如何做到这一点
顺便说一句,我备份@Boris the Spider 关于 Spring Boot 的评论。沿着这条路走,很多问题都会立即为你解决。
编辑 - 对第一条评论的反应:
通常,公共依赖项应部署到工件存储库(Nexus、Artifactory)中,并从那里作为任何第三方依赖项获取。
由于您没有这样做,因此在构建 A 期间您需要在本地存储库中具有公共依赖项。因此,将 Spring-boot-maven-plugin 放入 A 构建中,并使用多模块项目构建 fat jar。
| 归档时间: |
|
| 查看次数: |
7621 次 |
| 最近记录: |