带有 Maven Shade 插件的 Spring Boot - 未映射控制器(404 错误)

     2023-03-30     61

关键词:

【中文标题】带有 Maven Shade 插件的 Spring Boot - 未映射控制器(404 错误)【英文标题】:Spring Boot With Maven Shade Plugin - Controllers not mapped (404 Error) 【发布时间】:2016-02-14 17:23:37 【问题描述】:

对于我的带有嵌入式 tomcat 的 Spring boot 应用程序,由于某些限制,我需要取消 spring-boot-maven-plugin 并需要使用 maven-shade-plugin。使用 maven package 命令,我可以成功创建 jar 文件。但是,我所有的控制器都停止工作并给我 404 错误。放置在我的资源文件夹中的静态内容也不再提供。总是出现 404 错误。

我的 pom.xml

<dependencyManagement>
    <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.2.7.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <java.version>1.7</java.version>
</properties>

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

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

<build>
    <plugins>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>$java.version</source>
                <target>$java.version</target>
            </configuration>
        </plugin>


        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>

            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>

                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>abc.MyMainClass</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>


    </plugins>
</build>

我照常运行应用程序:

@SpringBootApplication
public class MyMainClass

    public static void main(String[] args) 
        SpringApplication.run(MyMainClass.class, args);
       

我还必须创建以下 EmbeddedServletContainerFactory bean,否则会引发错误。

@Bean
public EmbeddedServletContainerFactory servletContainer() 
    TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
    return tomcat;

最后,我只有一个示例控制器,

@RequestMapping(value = "/car", method = RequestMethod.GET)
@ResponseBody
public Car test() 
    return new Car();

当我使用 spring-boot-maven 插件时,同样的代码可以正常工作。在我开始使用 maven-shade-plugin 后不久,tomcat 就成功启动了。但是,所有控制器都给我 404 错误。如果我做错了什么,请指导我。

【问题讨论】:

如果有人可以提供一个带有 maven shade 插件的 Spring Boot 工作示例,那将会很有帮助。谢谢。 【参考方案1】:

如果你想从 spring-boot-maven 插件迁移到 maven-shade 插件,这非常简单。我在 pom.xml 中添加了以下插件信息并解决了问题。

(https://repo.maven.apache.org/maven2/org/springframework/boot/spring-boot-starter-parent/1.2.6.RELEASE/spring-boot-starter-parent-1.2.6.RELEASE.pom)

依赖管理:

    <dependencyManagement>
<dependencies>
    <dependency>
        <!-- Import dependency management from Spring Boot -->
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>1.2.7.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
    </dependency>
</dependencies>

构建插件:

<build>


    <plugins>


        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>$java.version</source>
                <target>$java.version</target>
            </configuration>
        </plugin>


        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>1.2.7.RELEASE</version>
                </dependency>
            </dependencies>
            <configuration>
                <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope>
                <createDependencyReducedPom>true</createDependencyReducedPom>
                <filters>
                    <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                            <exclude>META-INF/*.SF</exclude>
                            <exclude>META-INF/*.DSA</exclude>
                            <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                    </filter>
                </filters>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <transformers>
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                <resource>META-INF/spring.handlers</resource>
                            </transformer>
                            <transformer
                                implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer">
                                <resource>META-INF/spring.factories</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.ServicesResourceTransformer" />
                            <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>sg.butterfly.emenu.api.config.EmenuApp</mainClass>
                            </transformer>
                        </transformers>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>

</build>

【讨论】:

【参考方案2】:

除了现有的,尝试使用AppendingTransformer,例如:

<transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>abc.MyMainClass</mainClass>
                            </transformer>
<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.tooling</resource>
                                </transformer>

参考文档:https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#AppendingTransformer

【讨论】:

感谢您的快速回复。我试过了,但这不起作用。似乎我从 spring-boot-maven 插件迁移到 maven-shade-plugin 的方式是错误的。需要弄清楚如何正确配置它。

使用maven-shade-plugin打包maven项目,项目使用spring框架,打包成jar时报错,跪求大佬,弄了好久没出?

这个是我报错指令,和pom的写法,球球大佬!使用shade插件来打包.在shade的打包配制中指明spring.handlers和spring.schemas文件会以append方式加入进来,从而确保其他spring的jar中的这两个文件的信息不会被遗漏。追问现在是这样的,那... 查看详情

Maven shade插件打包DLL

】Mavenshade插件打包DLL【英文标题】:MavenshadepluginPackagingDLL【发布时间】:2014-07-2313:46:36【问题描述】:我必须在我的项目中添加一个JNI模块。我在Maven中将模块安装为两个不同的工件:jar库:mvninstall:install-file-DgroupId=com.test-Darti... 查看详情

使用 Shade 或 Maven 程序集插件从 Maven 项目构建可执行 Jar

】使用Shade或Maven程序集插件从Maven项目构建可执行Jar【英文标题】:BuildanexecutableJarfromaMavenProjectwithdependencieswithShadeorMavenAssemblyPlugin【发布时间】:2021-12-2813:55:36【问题描述】:我正在尝试创建一个打包了依赖项的可执行jar。到... 查看详情

由 Maven shade 插件构建的无效或损坏的 JAR 文件

】由Mavenshade插件构建的无效或损坏的JAR文件【英文标题】:InvalidorcorruptJARFilebuiltbyMavenshadeplugin【发布时间】:2012-10-1220:27:45【问题描述】:将MavenjFree依赖项添加到我现有的应用程序后,我无法执行创建的jar。我得到的唯一错误... 查看详情

Maven Shade 插件 + MsSQL JDBC -> 即时 JNI 错误 - 无效的签名文件清单

】MavenShade插件+MsSQLJDBC->即时JNI错误-无效的签名文件清单【英文标题】:MavenShadePlugin+MsSQLJDBC->instantJNIerror-InvalidsignaturefileManifest【发布时间】:2018-10-1014:30:31【问题描述】:在我开始使用MsSQLJDBC之前,我的Mavenshade插件运行良... 查看详情

将 maven-bundle-plugin 与 maven-shade-plugin 一起使用

...些包。我还使用maven-bundle-plugin来生成清单。问题是捆绑插件在阴影插件之前运行(在进程 查看详情

Maven shade插件将dependency-reduced-pom.xml添加到基本目录

】Mavenshade插件将dependency-reduced-pom.xml添加到基本目录【英文标题】:Mavenshadepluginaddingdependency-reduced-pom.xmltobasedirectory【发布时间】:2012-07-0401:52:16【问题描述】:mavenshade插件正在创建一个名为dependency-reduced-pom.xml的文件以及artifa... 查看详情

如何在 maven-shade-plugin 创建的 Jar 中包含测试类?

...题描述】:我正在尝试使用Maven将我的测试类打包到一个带有依赖项的可执行jar中,但我很难做到这一点。到目前为止,这是我的pom.xml:<project><modelV 查看详情

缺少 Maven Shade JavaFX 运行时组件

...ar。从我所做的研究来看,似乎最好的方法是通过mavenshade插件。但是,当我运行它时,我得到了这个错误:错误:JavaFX运行时组件丢失,是运行此应用程序所必需的我不 查看详情

缺少 Maven Shade JavaFX 运行时组件

...ar。从我所做的研究来看,似乎最好的方法是通过mavenshade插件。但是,当我运行它时,我得到了这个错误:错误:JavaFX运行时组件丢失,是运行此应用程序所必需的我不 查看详情

maven-shade-plugin 错误:在“资源”的 org.apache.maven.plugins.shade.resource.ManifestResourceTransformer 中找不

】maven-shade-plugin错误:在“资源”的org.apache.maven.plugins.shade.resource.ManifestResourceTransformer中找不到setter、adder或字段【英文标题】:maven-shade-pluginerror:Cannotfindsetter,addernorfieldinorg.apache.maven.plugins.shade.resource.Man 查看详情

maven-shade-plugin 的用途是啥,为啥要重新定位 Java 包?

】maven-shade-plugin的用途是啥,为啥要重新定位Java包?【英文标题】:Whatisthemaven-shade-pluginusedfor,andwhywouldyouwanttorelocateJavapackages?maven-shade-plugin的用途是什么,为什么要重新定位Java包?【发布时间】:2012-11-1704:50:41【问题描述】:... 查看详情

Netbeans:项目主神器通过maven-shade-plugin处理

】Netbeans:项目主神器通过maven-shade-plugin处理【英文标题】:Netbeans:project\'smainartifactisprocessedthroughmaven-shade-plugin【发布时间】:2014-09-0111:53:37【问题描述】:我正在使用maven-shade-plugin构建我的项目,而Netbeans8.0抱怨以下警告:项... 查看详情

如何判断哪个签名的 jar 导致 maven-shade-plugin 失败?

】如何判断哪个签名的jar导致maven-shade-plugin失败?【英文标题】:HowcanItellwhichsignedjariscausingmaven-shade-plugintofail?【发布时间】:2015-07-2319:24:46【问题描述】:要运行maven-shade-plugin,我必须使用here描述的方法,因为签名依赖项,如... 查看详情

maven-shade-plugin 和自定义包装类型

】maven-shade-plugin和自定义包装类型【英文标题】:maven-shade-pluginandcustompackagingtype【发布时间】:2015-09-2413:19:31【问题描述】:我正在尝试使用内置的依赖项打包一个OSGi包。我正在使用maven-shade-plugin2.3包含一些依赖项,但它在打... 查看详情

使用 maven-shade-plugin 构建的 pdfbox 程序的结果与正常的 NetBeans 运行不同

】使用maven-shade-plugin构建的pdfbox程序的结果与正常的NetBeans运行不同【英文标题】:Resultofprogramusingpdfboxbuiltwithmaven-shade-pluginisdifferentthannormalNetBeansRun【发布时间】:2013-02-0213:31:02【问题描述】:我有一个使用PDFBox1.7.1的java程序,... 查看详情

带有 JDK 17 的 Spring Boot 2.5+ - maven surefire 不执行现有测试

】带有JDK17的SpringBoot2.5+-mavensurefire不执行现有测试【英文标题】:SpringBoot2.5+withJDK17-mavensurefiredoesn\'texecuteexistingtests【发布时间】:2022-01-1523:40:33【问题描述】:使用JDK17将SpringBoot2.2应用程序更改为2.5.5时,Surefire测试插件不会启... 查看详情

Spring boot Flyway Jooq Code gen maven 插件顺序

...flyway:migrate始终在jooq:generate-sources之前执行?我正在使用带有SpringBoot的Maven包装器。<plugin><groupId&g 查看详情