如何在另一个项目中向spring启动jar添加依赖项?

h4cxqtbf  于 2021-07-24  发布在  Java
关注(0)|答案(10)|浏览(531)

我有一个spring启动应用程序,我用它创建了一个jar。下面是我的 pom.xml :

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf.extras</groupId>
        <artifactId>thymeleaf-extras-java8time</artifactId>
        <version>2.1.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!-- WebJars -->
    <dependency>
        <groupId>javax.mail</groupId>
        <artifactId>mail</artifactId>
        <version>1.4.7</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.6.2</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

我想在我的其他应用程序中使用这个jar,所以将这个jar添加到我的应用程序中。但是当我在那个jar中调用一个方法时,它抛出了一个 ClassNotFoundException .
如何解决此问题?如何向spring启动jar添加依赖关系?

vmdwslir

vmdwslir1#

默认情况下,springboot将jar重新打包到一个可执行jar中,并将所有类放入其中 BOOT-INF/classes ,以及其中的所有依赖库 BOOT-INF/lib . 创建这个胖jar的结果是,您不能再将它用作其他项目的依赖项。
从自定义重新打包分类器:
默认情况下 repackage 目标将用重新打包的工件替换原始工件。对于表示应用程序的模块来说,这是一种明智的行为,但是如果您的模块被用作另一个模块的依赖项,那么您需要为重新打包的模块提供一个分类器。
原因是应用程序类是打包在 BOOT-INF/classes 因此依赖模块无法加载重新打包的jar类。
如果您想保留原始的主工件以便将其用作依赖项,那么可以添加 classifierrepackage 目标配置:

<plugin>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-maven-plugin</artifactId>
  <version>1.4.1.RELEASE</version>
  <executions>
    <execution>
      <goals>
        <goal>repackage</goal>
      </goals>
      <configuration>
        <classifier>exec</classifier>
      </configuration>
    </execution>
  </executions>
</plugin>

通过这种配置,springbootmaven插件将创建2个jar:主jar将与通常的maven项目相同,而第二个jar将附加分类器并作为可执行jar。

nwo49xxi

nwo49xxi2#

tunaki的答案是正确的,但在SpringBoot2中不起作用。

Spring Boot1.x

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>1.5.20.RELEASE</version>
    <executions>
      <execution>
        <goals>
          <goal>repackage</goal>
        </goals>
        <configuration>
          <classifier>exec</classifier>
        </configuration>
      </execution>
    </executions>
    ...
  </plugin>

阅读更多

Spring Boot2.x

如果您正在使用 spring-boot-starter-parent ,的 repackage 在id为的执行中自动执行目标 repackage . 在该设置中,只应指定配置,如以下示例所示:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
      <execution>
        <id>repackage</id>
        <configuration>
          <classifier>exec</classifier>
        </configuration>
      </execution>
    </executions>
    ...
  </plugin>

阅读更多

uklbhaso

uklbhaso3#

对于springboot2@tunaki的答案必须根据文档进行修改,如果 spring-boot-starter-parent 用作父级:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
      <execution>
        <id>repackage</id>
        <configuration>
          <classifier>exec</classifier>
        </configuration>
      </execution>
    </executions>

注意额外的 <id>repackage</id> 必须从 spring-boot-starter-parent .

uttx8gqw

uttx8gqw4#

@tunaki所说的基本上是正确的,但根据你最初的问题,缺少的一部分是:
此抛出classnotfoundexception。spring启动应用程序中使用的外部jar丢失。
这是因为从maven打包创建的fatjar具有在特定位置指定的依赖库,这些库用于spring boot如何执行应用程序。如果您只是将jar添加到另一个应用程序的类路径中,那么您应该按照@tunaki所说的做,并将依赖jar文件包含到类路径中。最好的方法是使用maven依赖插件专门针对 dependency:copy-dependencies mojo将所有依赖项下载到一个文件夹中,然后在编译另一个应用程序时可以将该文件夹指定为库路径。

eagi6jfj

eagi6jfj5#

您可以通过maven程序集插件扩展您的项目

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>3.1.0</version>
        <configuration>
        <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        </configuration>
        <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
            <goal>single</goal>
            </goals>
            </execution>
        </executions>
</plugin>

建造完成后你会得到3个jar。主项目将与通常的maven项目相同,而第二个项目将在分类器后面附加exec,并作为可执行jar。第三个jar名称将由jar附加依赖项,并包含在spring boot应用程序(spring boot starter web,thymeleaf,…)中作为依赖项添加的类,因此在应用程序的pom中,您不必从spring boot project添加依赖项。

56lgkhnf

56lgkhnf6#

使用下面提供的构建部分,它将完成三件事:
使用springbootmaven插件创建springbootjar
使用maven汇编插件用源代码编译的类创建一个普通jar
在本地将普通jar安装到m2文件夹中
如果要将普通jar部署到远程存储库中,请配置deploy插件

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <appendAssemblyId>true</appendAssemblyId>
                        <descriptors>
                            <descriptor>src/main/resources/sources-jar-build.xml</descriptor>
                        </descriptors>
                        <finalName>${pom.artifactId}-${pom.version}</finalName>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
             <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                    <id>install-file</id>
                    <goals>
                        <goal>install-file</goal>
                    </goals>
                    <configuration>
                        <file>${pom.artifactId}-${pom.version}</file>
                        <artifactId>${pom.artifactId}</artifactId>
                        <groupId>${pom.groupId}</groupId>
                        <version>${pom.version}</version>
                    </configuration>
                </execution>
            </executions>               
        </plugin>
    </plugins>
</build>

将以下内容放在名为“sources jar build.xml”的文件中,放入参考资料文件夹:

<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
    <id>sources</id>
    <includeBaseDirectory>false</includeBaseDirectory>

    <formats>
        <format>jar</format>
    </formats>
    <fileSets>
        <fileSet>
            <directory>${project.basedir}/target/classes</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>
nlejzf6q

nlejzf6q7#

为SpringBootVersion2使用下面的插件*

<plugin>
     <groupId>org.springframework.boot</groupId>           
     <artifactId>spring-boot-maven-plugin</artifactId>
     <version>2.2.1.RELEASE</version>
     <configuration>
          <classifier>exec</classifier>
     </configuration>
</plugin>
q35jwt9p

q35jwt9p8#

您可以设置项目,使批处理启动程序依赖于jar,而jar将与其他应用程序共享。
按照你最初的要求,我说了不同的话:
我想在我的其他应用程序中使用这个jar,所以将这个jar添加到我的应用程序中。
假设jar是项目a,而应用程序是项目b。
现在,我的建议是,你从一个;然后你把它放到一个新的项目c中,它将嵌入SpringBoot,并且几乎完全依赖于a。
然后,由于a现在是一个简单的jar,因此b可以将其用作依赖项。

b4wnujal

b4wnujal9#

如果您想使用springboot项目作为依赖项,同时又想作为springbootjar运行,那么请使用下面的配置。通过下面的配置,您可以实现两个目标。

<plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <executions>
                <execution>
                    <id>build information</id>
                    <goals>
                        <goal>build-info</goal>
                    </goals>
                </execution>
                <execution>
                    <id>repackage</id>
                    <configuration>
                        <classifier>exec</classifier>
                    </configuration>
                </execution>
            </executions>
        </plugin>

此配置创建两个jar,如下面的示例屏幕截图所示:

bejyjqdl

bejyjqdl10#

任何项目如果你想添加为依赖你需要的项目 <groupId> , <artifactId> , <version> ,使用这些详细信息,您可以将项目作为依赖项添加到另一个模块或应用程序中,例如:your application pom details

<project 
        <groupId>com.sample</groupId>
        <artifactId>sampleapp</artifactId>
        <version>1.0</version>
        <packaging>jar</packaging>
</project>`

你的依赖性如下

<dependency>
 <groupId>com.sample</groupId>
 <artifactId>sampleapp</artifactId>
 <version>1.0</version>
</dependency>

相关问题