pom打包排除某个配置文件及目录

Java使用Maven打普通Jar包并排除特定包和类
博客介绍了在Java中使用Maven将项目打成普通Jar包时,如何排除某些包和类。通过配置maven-jar-plugin的excludes标签,可排除controller包、i18文件夹、mapper文件夹等,还能排除xml、yml、properties等资源文件及特定类。

<!-- 打成普通jar包,并排除某些包和类 -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <excludes>
          <!-- 排除controller包及下面的资源 -->
            <exclude>**/contro**</exclude>
            <exclude>**/controller/*</exclude>
            <!-- 排除i18文件夹  -->
            <exclude>**/i18**</exclude>
            <!-- 排除mapper 文件夹 -->
            <exclude>**/mappe**</exclude>
            
            <!-- 排除类路径下的资源文件 -->
            <exclude>**/**/**.xml</exclude>
            <exclude>**.yml</exclude>
             <exclude>**.properties</exclude>
             <exclude>**/**/**.properties</exclude>
              <exclude>**Demo</exclude> 
               <exclude>**/Demo**/**</exclude> 
               <exclude>**/Applic**/**</exclude> 
               <exclude>**/Swagger**/**</exclude> 
          </excludes>
          
        </configuration>
      </plugin>

<think> 我们正在解决一个Maven打包问题:构建WAR包时,未在pom.xml中声明的JAR包被漏掉(即未包含在WAR包中)。 这种情况通常发生在项目直接引用了本地JAR文件(未通过Maven仓库管理),或者由于Maven作用域(scope)设置导致依赖未被包含。 解决方案分两种情况: 1. 对于本地JAR文件(不在Maven仓库中): 我们需要将这些JAR包手动包含到WAR包中。可以通过配置maven-war-plugin的<webResources>来实现。 2. 对于通过Maven依赖但被错误排除的JAR包(比如作用域为provided或test): 需要检查依赖的作用域,改为compile(默认)或runtime。 这里重点解决第一种情况(本地JAR包)。 假设我们将本地JAR包放在项目的`lib`目录下(例如`src/main/webapp/WEB-INF/lib/`或自定义的目录),然后配置构建插件将其包含。 步骤: 1. 将需要手动添加的JAR包放入项目目录中,例如:`src/main/webapp/WEB-INF/lib/`(这样在构建时会被自动包含)或者自定义一个目录比如`lib`(与`src`同级)。 2. 在`pom.xml`中配置`maven-war-plugin`插件,将自定义目录中的JAR包复制到WAR包的`WEB-INF/lib/`目录配置示例: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <!-- 如果之前因为缺少web.xml报错,可以加上这个 --> <failOnMissingWebXml>false</failOnMissingWebXml> <!-- 配置额外的web资源(将自定义目录中的jar包复制到WEB-INF/lib) --> <webResources> <resource> <!-- 指定自定义JAR包所在的目录(相对于项目根目录) --> <directory>lib</directory> <targetPath>WEB-INF/lib</targetPath> <includes> <include>**/*.jar</include> </includes> </resource> </webResources> </configuration> </plugin> </plugins> </build> ``` 解释: - `<directory>lib</directory>`:指定存放本地JAR包的目录(这里假设是项目根目录下的`lib`文件夹)。 - `<targetPath>WEB-INF/lib</targetPath>`:指定这些JAR包在WAR包中的存放路径(即WAR包的`WEB-INF/lib`目录)。 - `<include>**/*.jar</include>`:包含该目录下所有的JAR文件。 3. 另一种做法是使用Maven的`system`作用域来引入本地JAR(不推荐,因为可移植性差): ```xml <dependency> <groupId>com.example</groupId> <artifactId>example</artifactId> <version>1.0</version> <scope>system</scope> <systemPath>${project.basedir}/lib/example.jar</systemPath> </dependency> ``` 但是,这种方式在构建WAR包时,默认不会将system作用域的依赖打包进去,除非在maven-war-plugin中配置`<includeSystemScope>true</includeSystemScope>`(从3.1.0版本开始支持): ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin> ``` 但是请注意,使用system作用域的依赖在团队协作和部署中可能会带来问题,因为路径是绝对路径或相对于项目的路径,其他开发人员可能没有相同的路径。 因此,推荐第一种方式:通过`webResources`将本地JAR包复制到WAR包中。 4. 如果是因为Maven依赖的作用域问题导致依赖没有被包含,则调整依赖的作用域。例如,将`provided`改为`compile`(默认)或`runtime`。 总结: 根据你的描述,问题在于“不在pom配置文件设置的jar包”,那么这些JAR包肯定没有在pom中声明。因此,我们采用第一种方案:将这些JAR包放在项目的一个目录中(比如`lib`),然后配置`maven-war-plugin`将它们包含到WAR包的`WEB-INF/lib`目录下。 注意:如果这些JAR包在pom中声明了,但是作用域是`provided`,那么需要将作用域改为`compile`(或者使用`runtime`),或者配置`maven-war-plugin`包含`provided`作用域的依赖(不推荐,因为provided作用域表示容器会提供,所以通常不需要打包)。 配置示例(包含provided作用域的依赖): ```xml <configuration> <packagingIncludes>WEB-INF/lib/*.jar</packagingIncludes> <!-- 或者更精确的,可以设置包含provided作用域的依赖 --> <!-- 注意:这会使得所有provided作用域的依赖都被打包,可能会引起冲突 --> <includeProvidedScope>true</includeProvidedScope> </configuration> ``` 但是,我们通常不建议将provided作用域的依赖打包,因为容器应该提供这些依赖。所以,请先确认这些JAR包是否确实需要打包。 因此,针对你的问题,核心步骤是: 1. 将未在pom中声明的JAR包放到项目的一个目录中(如`lib`)。 2. 在`maven-war-plugin`的配置中,将该目录中的JAR包复制到WAR包的`WEB-INF/lib`目录。 这样,构建WAR包时这些JAR就会被包含进去。 最后,执行`mvn clean package`重新打包。 如果问题仍然存在,可以检查WAR包中`WEB-INF/lib/`下是否有所需的JAR。 注意:如果这些JAR包是模块依赖,但没有在pom中声明,那么应该先在pom中声明它们(如果它们存在于Maven仓库中),或者使用上述方法手动包含。 相关问题: 1. 如何解决Maven构建WAR包时依赖冲突问题? 2. 如何将外部配置文件包含到WAR包中? 3. Maven的依赖作用域有哪些?分别代表什么含义? </think> ### 解决 WAR 打包时未在 POM 配置的 JAR 包被漏掉的问题 当 Maven 构建 WAR 包时遗漏未在 `pom.xml` 中声明的 JAR 包,通常是因为这些 JAR 未被正确纳入构建流程。以下是完整的解决方案: --- ### 🔧 核心解决方法:配置 `maven-war-plugin` 包含额外资源 在 `pom.xml` 中添加以下配置,将自定义 JAR 包目录包含到 WAR 中: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <!-- 包含未在POM声明的本地JAR包 --> <webResources> <resource> <!-- 本地JAR存放目录(相对于项目根目录) --> <directory>lib</directory> <targetPath>WEB-INF/lib</targetPath> <includes> <include>*.jar</include> </includes> </resource> </webResources> </configuration> </plugin> </plugins> </build> ``` #### 关键参数说明: 1. **`<directory>`**:指定本地 JAR 存放目录(如 `lib/`) 2. **`<targetPath>`**:WAR 包中的目标路径(必须是 `WEB-INF/lib`) 3. **`<includes>`**:包含的文件模式(支持通配符 `*.jar`) --- ### 📂 项目结构调整 确保物理目录存在: ``` 项目根目录/ ├── lib/ # 存放未在POM声明的JAR │ ├── custom1.jar │ └── custom2.jar ├── src/ │ └── main/ └── pom.xml ``` --- ### ⚠️ 其他注意事项 1. **检查依赖作用域** 若 JAR 已在 POM 中声明但被漏掉,检查作用域: ```xml <dependency> <groupId>com.example</groupId> <artifactId>custom-lib</artifactId> <version>1.0</version> <!-- 必须为compile/runtime(非provided/test) --> <scope>compile</scope> </dependency> ``` 2. **强制包含 `provided` 依赖**(慎用) 若需打包 `provided` 作用域的 JAR: ```xml <plugin> <artifactId>maven-war-plugin</artifactId> <configuration> <includeProvidedScope>true</includeProvidedScope> </configuration> </plugin> ``` 3. **验证 WAR 内容** 构建后检查 WAR 包内容: ```bash # 解压查看是否包含目标JAR unzip -l target/*.war | grep 'WEB-INF/lib.*jar' ``` --- ### 🌰 完整配置示例 ```xml <project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> <webResources> <!-- 包含本地lib目录所有JAR --> <resource> <directory>lib</directory> <targetPath>WEB-INF/lib</targetPath> <includes> <include>*.jar</include> </includes> </resource> <!-- 包含其他目录 --> <resource> <directory>external-jars</directory> <targetPath>WEB-INF/lib</targetPath> <includes> <include>**/*.jar</include> </includes> </resource> </webResources> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> ``` --- ### 🔍 排查步骤 1. **确认 JAR 物理位置** 确保 JAR 文件实际存在于配置的 `<directory>` 路径中 2. **检查路径大小写** Linux 环境下路径大小写敏感,确保匹配实际目录名称 3. **清理构建缓存** 删除 `target/` 目录后重新构建: ```bash mvn clean package ``` 4. **查看插件日志** 添加调试参数查看详细包含过程: ```bash mvn war:war -X | grep -i "including" ``` --- ### 💡 技术原理 - Maven 默认**只打包**在 `<dependencies>` 中声明的 JAR - `maven-war-plugin` 的 `<webResources>` 允许包含**任意额外资源** - 构建时插件会将指定目录内容**复制到 WAR 包**对应路径[^1] > **最佳实践**:推荐将自定义 JAR 上传到 Nexus 等私有仓库,通过标准依赖管理引入,避免手动包含[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值