一尘不染

如何编译无依赖的spring-boot-maven-plugin?

tomcat

我试图通过Spring引导来练习Java中的微服务,为此,我正在不同的项目中开发两个Web服务,目的是像两个独立文件(.war)一样将它们部署在tomcat中。

我已经阅读了有关设置tomcat的信息,以使其在指定的文件夹中具有依赖性,以便与其他服务共享它,并且这种方式不会在所有服务中增加相同的库。

问题是,当我通过工件spring-boot-maven-
plugin用工件编译maven时,.war文件始终具有内部依赖项。因为我想知道是否有人知道如何配置Maven以在Spring
Boot中从.war文件中删除依赖项.....。

.war之后是内部依赖项,已编辑:我已经添加了迈克尔·波特(Michael Potter)之类的提供和执行。它工作正常。我的pom.xml是以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>demo1</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.4.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
              <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
              <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </execution>
            </executions>
            </plugin>
        </plugins>
    </build>


</project>

阅读 494

收藏
2020-06-16

共1个答案

一尘不染

为了使Maven在您的WAR文件中不包括依赖项,您需要指定要 提供的* 范围 。Maven官方文档中的范围描述: *

这很像编译,但是表明您希望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise
Edition构建Web应用程序时,您将对Servlet API和相关Java EE
API的依赖关系设置为提供的范围,因为Web容器提供了这些类。该作用域仅在编译和测试类路径上可用,并且不可传递。

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.192</version>
    <scope>provided</scope>
</dependency>

将下载依赖项以编译源,但不打包在WAR中。

关于 spring-boot-maven-plugin
。默认情况下,它将对WAR进行重新打包,从而使您可以从控制台启动它。因此,它将所有必需的依赖项打包到存档中-即使具有 提供的
范围。您可以在目标目录中看到两个文件:重新打包的 {project-name} .war{project-name}
.war.original-
该文件不应包含提供的依赖项。要禁用重新打包,您应该将 spring-boot-maven-plugin
配置更改为以下内容:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
            <configuration>
                <skip>true</skip>
            </configuration>
        </execution>
    </executions>
</plugin>

然后,您需要将所需的依赖项放置到 tomcat / lib 文件夹中,然后重新启动Tomcat。

2020-06-16