【问题标题】:Creation of executable jar with maven, spring boot and repo-less 3rd party libs fail either way使用 maven、spring boot 和 repo-less 3rd 方库创建可执行 jar 失败
【发布时间】: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


    【解决方案1】:

    您是否考虑过建立一个内部 maven 存储库?最简单的是 Apache Archival (https://archiva.apache.org/index.cgi):

    对于 Apache Archival,您实际上可以手动将第三方库复制到 maven 存储库中。

    在您的 pom.xml 中,您必须添加以下内容:

    <repositories>
        <repository>
            <id>internal</id>
            <name>Archiva Managed Internal Repository</name>
            <url>http://IP_ADDRESS:PORT/repository/internal/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
    

    【讨论】:

    • 不,我没有,因为我不知道档案。刚刚检查并有可用的 docker 图像。这很棒,因为我使用了构建服务器。这种方法能让我摆脱这些“类路径”或“找不到库”问题吗?看起来很有希望。
    • 当我遇到像你这样的类似问题时,我使用了这种方法:-)
    • 所以,刚刚用archiva启动了一个docker容器(感谢docker),用groupId/artifactId等编写了ac#程序生成我的命令行,将工件部署到新的内部仓库,更新了我的pom,编译,启动并且非常高兴。谢谢你,你救了我的一周,也许还有圣诞节 :) 真的很棒。 jar 被打包并启动。据我测试,一切都按预期工作。非常好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2020-08-09
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多