<scope>provided</scope> 关于maven依赖中的scope的作用和用法

本文详细解析Maven中依赖范围(scope)的概念,包括compile、test、runtime、provided和system等,阐述它们在不同项目阶段的作用及如何影响依赖传递。同时,介绍了如何使用<optional>标签来控制依赖是否传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

举例如下:

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

scope的值有以下几种可能,进行分情况讲解:

  • compile

默认就是compile,什么都不配置也就是意味着compile。compile表示被依赖项目需要参与当前项目的编译,当然后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去。默认的scope,在部署的时候将会打包到lib目录下,项目在编译,测试,运行阶段都需要

  • test

scope为test表示依赖项目仅仅参与测试相关的工作,在编译和运行环境下都不会被使用,更别说打包了。

  • runntime

runntime这个scope,仅仅适用于运行环境,在编译和测试环境下都不会被使用

  • provided

provided适合在编译和测试的环境,他和compile很接近,但是provide仅仅需要在编译和测试阶段,同样provide将不会被打包到lib目录下。

  • system

从参与度来说,也provided相同,不过被依赖项不会从maven仓库抓,而是从本地文件系统拿,一定需要配合systemPath属性使用

  • scope的依赖传递

A–>B–>C。当前项目为A,A依赖于B,B依赖于C。知道B在A项目中的scope,那么怎么知道C在A中的scope呢?答案是: 
当C是test或者provided时,C直接被丢弃,A不依赖C; 
否则A依赖C,C的scope继承于B的scope。

为什么需要区分这些scope

可以用来限制dependency的范围可以在不同的环境下打包不同的jar包,比如junit测试类的jar包不需要在编译运行的时候,就可以设置scope为test。

最后还有一个<optional>true</optional>是什么意思,怎么用的呢?

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
</dependency>

例如上面的例子,在SpringBoot官网文件中你可以得到解释就是,<optional>true</optional>的话,其他项目依赖此项目也不会进行传递,只能本项目使用。

此文参考了很多博客的见解以及个人所在官网看到的综合性讲解。感谢各位博主!

&lt;?xml version="1.0" encoding="UTF-8"?> &lt;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"> &lt;modelVersion>4.0.0&lt;/modelVersion> &lt;groupId>com.gdsc.bio&lt;/groupId> &lt;artifactId>bio-backend-service&lt;/artifactId> &lt;version>1.1.39&lt;/version> &lt;!-- 定义profile --> &lt;profiles> &lt;!-- 开发环境 --> &lt;profile> &lt;id>dev&lt;/id> &lt;properties> &lt;!-- 定义profileActive属性 --> &lt;profileActive>dev&lt;/profileActive> &lt;/properties> &lt;activation> &lt;activeByDefault>true&lt;/activeByDefault> &lt;/activation> &lt;/profile> &lt;!-- 测试环境 --> &lt;profile> &lt;id>test&lt;/id> &lt;properties> &lt;profileActive>test&lt;/profileActive> &lt;/properties> &lt;/profile> &lt;!-- 生产环境 --> &lt;profile> &lt;id>prod&lt;/id> &lt;properties> &lt;profileActive>release&lt;/profileActive> &lt;/properties> &lt;/profile> &lt;/profiles> &lt;parent> &lt;groupId>org.springframework.boot&lt;/groupId> &lt;artifactId>spring-boot-starter-parent&lt;/artifactId> &lt;version>2.1.3.RELEASE&lt;/version> &lt;relativePath/> &lt;/parent> &lt;dependencies> &lt;!--okhttp--> &lt;dependency> &lt;groupId>com.squareup.okhttp3&lt;/groupId> &lt;artifactId>okhttp&lt;/artifactId> &lt;version>3.14.9&lt;/version> &lt;/dependency> &lt;!--test--> &lt;dependency> &lt;groupId>org.springframework.boot&lt;/groupId> &lt;artifactId>spring-boot-starter-test&lt;/artifactId> &lt;/dependency> &lt;dependency> &lt;groupId>cn.hutool&lt;/groupId> &lt;artifactId>hutool-all&lt;/artifactId> &lt;version>5.0.7&lt;/version> &lt;/dependency> &lt;!--rabbitmq消息队列--> &lt;!--rabbitmq--> &lt;dependency> &lt;groupId>org.springframework.boot&lt;/groupId> &lt;artifactId>spring-boot-starter-amqp&lt;/artifactId> &lt;exclusions> &lt;exclusion> &lt;groupId>org.springframework.boot&lt;/groupId> &lt;artifactId>spring-boot-starter-logging&lt;/artifactId> &lt;/exclusion> &lt;/exclusions> &lt;/dependency> &lt;!-- Lombok --> &lt;dependency> &lt;groupId>org.projectlombok&lt;/groupId> &lt;artifactId>lombok&lt;/artifactId> &lt;/dependency> &lt;!--集成springmvc框架并实现自动配置 --> &lt;dependency> &lt;groupId>org.springframework.boot&lt;/groupId> &lt;artifactId>spring-boot-starter-web&lt;/artifactId> &lt;!-- 排除log4j --> &lt;exclusions> &lt;exclusion> &lt;groupId>org.apache.logging.log4j&lt;/groupId> &lt;artifactId>log4j-to-slf4j&lt;/artifactId> &lt;/exclusion> &lt;exclusion> &lt;groupId>ch.qos.logback&lt;/groupId> &lt;artifactId>logback-classic&lt;/artifactId> &lt;/exclusion> &lt;exclusion> &lt;groupId>ch.qos.logback&lt;/groupId> &lt;artifactId>logback-core&lt;/artifactId> &lt;/exclusion> &lt;/exclusions> &lt;/dependency> &lt;!-- 使用最新的logback --> &lt;dependency> &lt;groupId>ch.qos.logback&lt;/groupId> &lt;artifactId>logback-classic&lt;/artifactId> &lt;version>1.2.10&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>com.gdsc&lt;/groupId> &lt;artifactId>scadp-core&lt;/artifactId> &lt;version>2.48-SNAPSHOT&lt;/version> &lt;!--排除自带的poi--> &lt;exclusions> &lt;exclusion> &lt;groupId>org.apache.poi&lt;/groupId> &lt;artifactId>*&lt;/artifactId> &lt;/exclusion> &lt;/exclusions> &lt;/dependency> &lt;dependency> &lt;groupId>org.springframework&lt;/groupId> &lt;artifactId>spring-orm&lt;/artifactId> &lt;version>3.2.5.RELEASE&lt;/version> &lt;/dependency> &lt;!-- https://mvnrepository.com/artifact/commons-digester/commons-digester --> &lt;dependency> &lt;groupId>commons-digester&lt;/groupId> &lt;artifactId>commons-digester&lt;/artifactId> &lt;version>1.6&lt;/version> &lt;exclusions> &lt;exclusion> &lt;artifactId>commons-beanutils&lt;/artifactId> &lt;groupId>commons-beanutils&lt;/groupId> &lt;/exclusion> &lt;/exclusions> &lt;/dependency> &lt;!-- https://mvnrepository.com/artifact/commons-collections/commons-collections --> &lt;dependency> &lt;groupId>commons-collections&lt;/groupId> &lt;artifactId>commons-collections&lt;/artifactId> &lt;version>3.2.1&lt;/version> &lt;/dependency> &lt;!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils --> &lt;dependency> &lt;groupId>commons-beanutils&lt;/groupId> &lt;artifactId>commons-beanutils&lt;/artifactId> &lt;version>1.8.3&lt;/version> &lt;/dependency> &lt;!-- https://mvnrepository.com/artifact/org.codehaus.groovy/groovy-all --> &lt;dependency> &lt;groupId>org.codehaus.groovy&lt;/groupId> &lt;artifactId>groovy-all&lt;/artifactId> &lt;version>2.4.12&lt;/version> &lt;/dependency> &lt;!-- https://mvnrepository.com/artifact/com.lowagie/itext --> &lt;dependency> &lt;groupId>com.lowagie&lt;/groupId> &lt;artifactId>itext&lt;/artifactId> &lt;version>2.1.7&lt;/version> &lt;/dependency> &lt;!-- https://mvnrepository.com/artifact/com.lowagie/itextasian --> &lt;dependency> &lt;groupId>com.lowagie&lt;/groupId> &lt;artifactId>itextasian&lt;/artifactId> &lt;version>1.5.2&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>org.jbarcode&lt;/groupId> &lt;artifactId>jbarcode&lt;/artifactId> &lt;version>0.2.8&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>com.belerweb&lt;/groupId> &lt;artifactId>pinyin4j&lt;/artifactId> &lt;version>2.5.0&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>org.freemarker&lt;/groupId> &lt;artifactId>freemarker&lt;/artifactId> &lt;version>2.3.30&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>com.qrcode&lt;/groupId> &lt;artifactId>qrcode&lt;/artifactId> &lt;version>1.0&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>com.lowagie&lt;/groupId> &lt;artifactId>itext-rtf&lt;/artifactId> &lt;version>2.1.7&lt;/version> &lt;/dependency> &lt;!-- Swagger API文档 --> &lt;dependency> &lt;groupId>io.springfox&lt;/groupId> &lt;artifactId>springfox-swagger2&lt;/artifactId> &lt;version>2.9.2&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>io.springfox&lt;/groupId> &lt;artifactId>springfox-swagger-ui&lt;/artifactId> &lt;version>2.9.2&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>com.github.xiaoymin&lt;/groupId> &lt;artifactId>swagger-bootstrap-ui&lt;/artifactId> &lt;version>1.9.3&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>io.springfox&lt;/groupId> &lt;artifactId>springfox-bean-validators&lt;/artifactId> &lt;version>2.9.2&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>org.apache.commons&lt;/groupId> &lt;artifactId>commons-jexl&lt;/artifactId> &lt;version>2.0&lt;/version> &lt;/dependency> &lt;!-- nacos --> &lt;dependency> &lt;groupId>com.alibaba.cloud&lt;/groupId> &lt;artifactId>spring-cloud-starter-alibaba-nacos-discovery&lt;/artifactId> &lt;version>2.1.0.RELEASE&lt;/version> &lt;/dependency> &lt;!-- 如果走配置中心需要添加此依赖--> &lt;dependency> &lt;groupId>com.alibaba.cloud&lt;/groupId> &lt;artifactId>spring-cloud-starter-alibaba-nacos-config&lt;/artifactId> &lt;version>2.1.0.RELEASE&lt;/version> &lt;/dependency> &lt;!--&lt;!– https://mvnrepository.com/artifact/com.jfinal/jfinal –>--> &lt;!--&lt;dependency>--> &lt;!--&lt;groupId>com.jfinal&lt;/groupId>--> &lt;!--&lt;artifactId>jfinal&lt;/artifactId>--> &lt;!--&lt;version>3.4&lt;/version>--> &lt;!--&lt;/dependency>--> &lt;!--&lt;!– https://mvnrepository.com/artifact/log4j/log4j –>--> &lt;!--&lt;dependency>--> &lt;!--&lt;groupId>log4j&lt;/groupId>--> &lt;!--&lt;artifactId>log4j&lt;/artifactId>--> &lt;!--&lt;version>1.2.17&lt;/version>--> &lt;!--&lt;/dependency>--> &lt;!--&lt;dependency>--> &lt;!--&lt;groupId>org.slf4j&lt;/groupId>--> &lt;!--&lt;artifactId>slf4j-api&lt;/artifactId>--> &lt;!--&lt;version>1.7.25&lt;/version>--> &lt;!--&lt;/dependency>--> &lt;!--&lt;!– https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api –>--> &lt;!--&lt;dependency>--> &lt;!--&lt;groupId>javax.servlet&lt;/groupId>--> &lt;!--&lt;artifactId>javax.servlet-api&lt;/artifactId>--> &lt;!--&lt;version>3.1.0&lt;/version>--> &lt;!--&lt;scope&gt;provided&lt;/scope&gt;--> &lt;!--&lt;/dependency>--> &lt;!-- scadp-service-api --> &lt;!-- &lt;dependency>--> &lt;!-- &lt;groupId>com.gdsc&lt;/groupId>--> &lt;!-- &lt;artifactId>scadp-service-api&lt;/artifactId>--> &lt;!-- &lt;version>1.0.2-SNAPSHOT&lt;/version>--> &lt;!-- &lt;/dependency>--> &lt;!-- xxl-job-core --> &lt;dependency> &lt;groupId>com.xuxueli&lt;/groupId> &lt;artifactId>xxl-job-core&lt;/artifactId> &lt;version>2.3.0&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>net.sf.jxls&lt;/groupId> &lt;artifactId>jxls-core&lt;/artifactId> &lt;version>1.0.1&lt;/version> &lt;!--排除自带的poi--> &lt;exclusions> &lt;exclusion> &lt;groupId>org.apache.poi&lt;/groupId> &lt;artifactId>*&lt;/artifactId> &lt;/exclusion> &lt;/exclusions> &lt;/dependency> &lt;dependency> &lt;groupId>org.apache.poi&lt;/groupId> &lt;artifactId>poi&lt;/artifactId> &lt;version>3.17&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>org.apache.poi&lt;/groupId> &lt;artifactId>poi-ooxml&lt;/artifactId> &lt;version>3.17&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>org.apache.commons&lt;/groupId> &lt;artifactId>commons-jexl3&lt;/artifactId> &lt;version>3.1&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>org.apache.poi&lt;/groupId> &lt;artifactId>poi&lt;/artifactId> &lt;version>4.1.2&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>org.apache.poi&lt;/groupId> &lt;artifactId>poi-ooxml&lt;/artifactId> &lt;version>4.1.2&lt;/version> &lt;/dependency> &lt;dependency> &lt;groupId>com.alibaba&lt;/groupId> &lt;artifactId>easyexcel&lt;/artifactId> &lt;version>4.0.3&lt;/version> &lt;!--排除自带的poi--> &lt;!-- &lt;exclusions>--> &lt;!-- &lt;exclusion>--> &lt;!-- &lt;groupId>org.apache.poi&lt;/groupId>--> &lt;!-- &lt;artifactId>*&lt;/artifactId>--> &lt;!-- &lt;/exclusion>--> &lt;!-- &lt;/exclusions>--> &lt;/dependency> &lt;!-- 日志 --> &lt;!-- logback-classic --> &lt;!-- &lt;dependency>--> &lt;!-- &lt;groupId>ch.qos.logback&lt;/groupId>--> &lt;!-- &lt;artifactId>logback-classic&lt;/artifactId>--> &lt;!-- &lt;/dependency>--> &lt;!-- skywalking的logback依赖 --> &lt;dependency> &lt;groupId>org.apache.skywalking&lt;/groupId> &lt;artifactId>apm-toolkit-logback-1.x&lt;/artifactId> &lt;version>8.7.0&lt;/version> &lt;/dependency> &lt;!--与logstash对应的日志收集依赖--> &lt;dependency> &lt;groupId>net.logstash.logback&lt;/groupId> &lt;artifactId>logstash-logback-encoder&lt;/artifactId> &lt;version>4.10&lt;/version> &lt;/dependency> &lt;/dependencies> &lt;build> &lt;finalName>${project.name}-${project.version}-${profileActive}&lt;/finalName> &lt;plugins> &lt;plugin> &lt;groupId>org.apache.maven.plugins&lt;/groupId> &lt;artifactId>maven-shade-plugin&lt;/artifactId> &lt;version>3.3.0&lt;/version> &lt;executions> &lt;execution> &lt;phase>package&lt;/phase> &lt;goals> &lt;goal>shade&lt;/goal> &lt;/goals> &lt;configuration> &lt;artifactSet> &lt;includes> &lt;include>net.sf.jxls:jxls-core&lt;/include> &lt;include>org.apache.poi:poi&lt;/include> &lt;include>org.apache.poi:poi-ooxml&lt;/include> &lt;/includes> &lt;/artifactSet> &lt;relocations> &lt;relocation> &lt;pattern>org.apache.poi&lt;/pattern> &lt;shadedPattern>shaded.jxls.poi&lt;/shadedPattern> &lt;/relocation> &lt;/relocations> &lt;transformers> &lt;!-- 1. 处理 Manifest 文件 --> &lt;transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer&quot;/> &lt;!-- 2. 合并 Service Loader 文件 --> &lt;transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer&quot;/> &lt;!-- 3. 合并其他资源文件(如 spring.handlers) --> &lt;transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> &lt;resource>META-INF/spring.handlers&lt;/resource> &lt;/transformer> &lt;/transformers> &lt;/configuration> &lt;/execution> &lt;/executions> &lt;/plugin> &lt;plugin> &lt;groupId>org.springframework.boot&lt;/groupId> &lt;artifactId>spring-boot-maven-plugin&lt;/artifactId> &lt;/plugin> &lt;!--&lt;plugin> &lt;groupId>org.springframework.boot&lt;/groupId> &lt;artifactId>spring-boot-maven-plugin&lt;/artifactId> &lt;/plugin> 指定JDK编译版本 --> &lt;plugin> &lt;groupId>org.apache.maven.plugins&lt;/groupId> &lt;artifactId>maven-compiler-plugin&lt;/artifactId> &lt;configuration> &lt;source>1.8&lt;/source> &lt;target>1.8&lt;/target> &lt;encoding>UTF-8&lt;/encoding> &lt;/configuration> &lt;/plugin> &lt;!-- 打包跳过测试 --> &lt;plugin> &lt;groupId>org.apache.maven.plugins&lt;/groupId> &lt;artifactId>maven-surefire-plugin&lt;/artifactId> &lt;configuration> &lt;skipTests>true&lt;/skipTests> &lt;/configuration> &lt;/plugin> &lt;!-- 避免font文件的二进制文件格式压缩破坏 --> &lt;plugin> &lt;groupId>org.apache.maven.plugins&lt;/groupId> &lt;artifactId>maven-resources-plugin&lt;/artifactId> &lt;configuration> &lt;nonFilteredFileExtensions> &lt;nonFilteredFileExtension>jasper&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>jrxml&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>xls&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>xlsx&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>ftl&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>doc&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>docx&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>woff&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>woff2&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>eot&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>ttf&lt;/nonFilteredFileExtension> &lt;nonFilteredFileExtension>svg&lt;/nonFilteredFileExtension> &lt;/nonFilteredFileExtensions> &lt;/configuration> &lt;/plugin> &lt;/plugins> &lt;resources> &lt;resource> &lt;directory>src/main/java&lt;/directory> &lt;includes> &lt;include>**/*.xls&lt;/include> &lt;include>**/*.xlsx&lt;/include> &lt;include>**/*.xml&lt;/include> &lt;include>**/*.json&lt;/include> &lt;include>**/*.ftl&lt;/include> &lt;/includes> &lt;/resource> &lt;!--&lt;resource> &lt;directory>src/main/resources/template&lt;/directory> &lt;/resource> &lt;resource> &lt;directory>src/main/resources/watermark&lt;/directory> &lt;/resource> &lt;resource> &lt;directory>src/main/resources/additional&lt;/directory> &lt;/resource>--> &lt;resource> &lt;directory>src/main/resources&lt;/directory> &lt;filtering>true&lt;/filtering> &lt;excludes> &lt;exclude>**/*.xls&lt;/exclude> &lt;exclude>**/*.xlsx&lt;/exclude> &lt;/excludes> &lt;/resource> &lt;resource> &lt;directory>src/main/resources&lt;/directory> &lt;filtering>false&lt;/filtering> &lt;includes> &lt;include>**/*.xml&lt;/include> &lt;include>**/*.xls&lt;/include> &lt;include>**/*.xlsx&lt;/include> &lt;include>**/*.jasper&lt;/include> &lt;include>**/*.jrxml&lt;/include> &lt;/includes> &lt;/resource> &lt;/resources> &lt;/build> &lt;/project> Cannot find 'resource' in class org.apache.maven.plugins.shade.resource.ManifestResourceTransformer
最新发布
06-18
&lt;think>我们正在解决一个Maven构建问题:在使用maven-shade-plugin时,遇到无法找到'resource'字段在类org.apache.maven.plugins.shade.resource.ManifestResourceTransformer中的错误。根据经验,这个错误通常是由于插件配置中使用了不正确的属性名导致的。在ManifestResourceTransformer中,用于指定清单文件(MANIFEST.MF)的Main-Class的属性名是"mainClass",而不是"resource"。但是,问题描述中提到了'resource'字段,这可能是用户在配置中尝试设置一个资源相关的属性,而实际上在ManifestResourceTransformer中并没有名为'resource'的字段。让我们查阅maven-shade-plugin的官方文档:在ManifestResourceTransformer的配置中,可以设置的属性包括:-mainClass:指定可执行jar的主类(即Main-Class清单属性)。-manifestEntries:用于指定其他任意的清单属性(键值对)。-etc.因此,用户可能在配置中写了类似如下的内容:&lt;transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">&lt;resource>com.example.Main&lt;/resource>&lt;/transformer>但正确的配置应该是使用&lt;mainClass>:&lt;transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">&lt;mainClass>com.example.Main&lt;/mainClass>&lt;/transformer>另外,如果用户想要添加其他清单属性,应该使用&lt;manifestEntries>,例如:&lt;transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">&lt;mainClass>com.example.Main&lt;/mainClass>&lt;manifestEntries>&lt;Class-Path>.&lt;/Class-Path>&lt;Build-Number>123&lt;/Build-Number>&lt;/manifestEntries>&lt;/transformer>所以,解决方案是:检查pom.xml中maven-shade-plugin的配置,确保对于ManifestResourceTransformer使用的是正确的属性名(mainClass或manifestEntries),而不是resource。此外,还需要注意:maven-shade-plugin的版本也可能影响可用的配置属性。建议使用较新的稳定版本(如3.2.4或更高)。步骤总结:1.打开pom.xml文件,找到maven-shade-plugin的配置部分。2.检查所有使用org.apache.maven.plugins.shade.resource.ManifestResourceTransformer的地方。3.将&lt;resource>元素(如果有)替换为&lt;mainClass>(如果意图是设置主类)或使用&lt;manifestEntries>设置其他清单属性。4.确保插件版本较新(至少3.2.4),如果不是,升级插件版本。示例配置:```xml&lt;build>&lt;plugins>&lt;plugin>&lt;groupId>org.apache.maven.plugins&lt;/groupId>&lt;artifactId>maven-shade-plugin&lt;/artifactId>&lt;version>3.4.1&lt;/version>&lt;!--使用较新版本-->&lt;executions>&lt;execution>&lt;phase>package&lt;/phase>&lt;goals>&lt;goal>shade&lt;/goal>&lt;/goals>&lt;configuration>&lt;transformers>&lt;transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">&lt;mainClass>com.example.Main&lt;/mainClass>&lt;!--这里设置主类-->&lt;!--可选:其他清单属性-->&lt;manifestEntries>&lt;Class-Path>.&lt;/Class-Path>&lt;/manifestEntries>&lt;/transformer>&lt;/transformers>&lt;/configuration>&lt;/execution>&lt;/executions>&lt;/plugin>&lt;/plugins>&lt;/build>```如果问题仍然存在,请检查错误信息是否确实是由于这个配置引起的,或者是否有其他配置问题。相关问题:1.如何配置maven-shade-plugin来生成可执行jar?2.在maven-shade-plugin中,除了ManifestResourceTransformer还有哪些常用的Transformer?3.如何解决maven-shade-plugin打包时出现的重复资源问题?&lt;/think>### 解决 `ManifestResourceTransformer` 缺失 `resource` 字段的问题 在 Maven 项目中使用 `maven-shade-plugin` 时,配置 `ManifestResourceTransformer` 时遇到无法找到 `resource` 字段的错误,通常是由于 **配置属性名错误** 或 **插件版本兼容性问题** 导致的。以下是详细解决方案: --- #### 原因分析 1. **属性名错误** `ManifestResourceTransformer` 的正确属性是 `mainClass`(用于设置主类),而非 `resource`。错误配置示例: ```xml &lt;!-- ❌ 错误写法:resource 字段不存在 --> &lt;transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> &lt;resource>com.example.Main&lt;/resource> &lt;!-- 此处错误 --> &lt;/transformer> ``` 2. **插件版本过旧** 旧版本插件(如 `&lt; 3.0`)可能不支持标准属性名。 --- #### 解决方案 ##### 1. 修正属性名(推荐) 将 `resource` 替换为 `mainClass`: ```xml &lt;build> &lt;plugins> &lt;plugin> &lt;groupId>org.apache.maven.plugins&lt;/groupId> &lt;artifactId>maven-shade-plugin&lt;/artifactId> &lt;version>3.5.1&lt;/version> &lt;!-- 使用较新版本 --> &lt;executions> &lt;execution> &lt;phase>package&lt;/phase> &lt;goals>&lt;goal>shade&lt;/goal>&lt;/goals> &lt;configuration> &lt;transformers> &lt;!-- ✅ 正确写法:使用 mainClass --> &lt;transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> &lt;mainClass>com.example.Main&lt;/mainClass> &lt;!-- 设置主类 --> &lt;/transformer> &lt;/transformers> &lt;/configuration> &lt;/execution> &lt;/executions> &lt;/plugin> &lt;/plugins> &lt;/build> ``` ##### 2. 升级插件版本 若问题持续,升级到最新版插件(截至2024年推荐 `3.5.1`): ```xml &lt;version>3.5.1&lt;/version> &lt;!-- 修复旧版本的兼容性问题 --> ``` ##### 3. 添加其他清单属性(可选) 如需设置更多清单属性(如 `Class-Path`),使用 `manifestEntries`: ```xml &lt;transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> &lt;mainClass>com.example.Main&lt;/mainClass> &lt;manifestEntries> &lt;Class-Path>libs/&lt;/Class-Path> &lt;Build-Time>${maven.build.timestamp}&lt;/Build-Time> &lt;/manifestEntries> &lt;/transformer> ``` --- #### 验证步骤 1. 清理并重新构建项目: ```bash mvn clean package ``` 2. 检查生成的 `MANIFEST.MF` 文件(位于 `target/*-shaded.jar` 中),确认包含: ``` Main-Class: com.example.Main Class-Path: libs/ ``` > **注意**:如果依赖冲突导致类加载问题,可添加 `ServicesResourceTransformer` 解决 SPI 服务文件冲突[^1]。 --- #### 常见错误排查 | 错误现象 | 解决方案 | |-----------------------------------|------------------------------------------| | `No such field: resource` | 将 `&lt;resource>` 改为 `&lt;mainClass>` | | 主类未生效 | 检查 `mainClass` 值是否包含完整包路径 | | 清单文件未生成 | 确认插件已绑定到 `package` 阶段 | 通过上述步骤,可解决 `resource` 字段缺失问题并正确生成可执行 JAR。 [^1]: Maven 官方文档中关于 `ServicesResourceTransformer` 的说明:解决 SPI 配置文件冲突。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值