【发布时间】:2019-05-19 19:35:37
【问题描述】:
我即将部署我的第一个 jar 应用程序。所以这可能是一个菜鸟问题。总而言之,我的问题是如何使用 maven 和 spring 生成一个可执行 jar,它还包含 3rd 方库(不在 repo 中)(uberJar)或一个 jar,可以使用给定的类路径运行。我尝试了几种方法 live maven-assembly-plugin、maven-shade-plugin 等。
我从 java 开始,因为我不得不并决定使用 maven 和 spring boot。我的项目基于 3rd 方 jars,它们不在 repo 中,因为开发人员认为,这些 jars 是超级机密的。这是我的问题的一部分。
所以我将 jars 添加到 libs/[companyname] 并在 intellij 中创建了该文件夹的“库”以将 jars 包含在类路径中(?)。在开发过程中,一切正常。
使用 maven 构建失败(找不到符号)。所以我将所有 80 多个 3rd 方 jar 添加到 pom.xml(系统范围,系统路径 = ${project.basedir}/libs/companyname)。我不想创建本地存储库,因为库(80+)的更新包含在一个完整的包中,可以一对一地替换。Maven 构建,但鉴于该错误消息,jar 不可运行
java.lang.NoClassDefFoundError:
所以我想,这些库在 jar 中用于编译,但不能从主类“访问”。所以我在 pom 中添加了 maven-assembly-plugin 来创建一个 uberJar。这在 16 分钟后失败,并且在 bountycastle 包中没有错误消息。这似乎是一个普遍的问题。我去了 maven-shade-plugin。这为我创建了一个 uberJar (60MB),但 spring 无法启动,因为它找不到这些 3rd 方库。我不知道为什么。
所以我想扔掉 uberJar-Method 并使用 classpath-method,但我不知道该怎么做。结果,我是否部署 uberJar 或带有类路径库的 jar 对我来说并不重要。它只需要运行。但是 uberJar 会更好。
好的,这里是我的项目和 pom.xml 的一些细节
\root
- \libs
- \[companyname] <-- 3rd party libs
- \src
- \main
- \....
- pom.xml
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
</parent>
<dependencies>
<!-- Libs from official repos -->
<dependency>
...
</dependency>
...
<!-- These 80+ secret 3rd party libs with no repo -->
<dependency>
<groupId>...</groupId>
<artifactId>...<artifactId>
<version>1.0.0.10</version>
<scope>system</scope>
<systemPath>${project.basedir}/libs/[companyname]/artifactName-1.0.0.10.jar</systemPath>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>libs/[companyname]/**</directory>
<filtering>true</filtering>
<includes>
<include>*.jar</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>my main class name / namespace</mainClass>
<layout>JAR</layout>
</configuration>
</plugin>
<!--
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.1</version>
<configuration>
<minimizeJar>false</minimizeJar>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
</transformers>
</configuration>
</plugin>
-->
</plugins>
</build>
我希望有人可以帮助并解释我如何处理这个话题。我读了很多书,尝试了很多次,但每次尝试都以不同的错误信息告终。那令人沮丧。
谢谢大家!
【问题讨论】:
标签: java spring maven spring-boot jar