Maven 打包时把依赖打包到指定目录方法

本文介绍了一种通过将Web应用依赖库移出WAR包并配置Maven插件来减小WAR文件体积的方法,从而提高上传速度。

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

最近系统上线频繁,每次系统上线,当用maven打成war的时候,由于war包中都包括了lib,所以每次war挺大,往生产上上传的时候挺慢,后来把这些lib包都移到tomcat的上层,新建了个tomcat/locallib,把所有webapp/lib下得war都移动这个目录。以后只要打war的时候不包括lib包即可,这样war就大大减小。
要做到用maven中打war包得时候不包括lib包可以进行如下配置:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.2</version>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>package</phase>
                        <goals>   
                            <goal>copy-dependencies</goal>
                        </goals>
            <configuration>
                <outputDirectory>${project.build.directory}/locallib</outputDirectory>
                <overWriteReleases>false</overWriteReleases>
                <overWriteSnapshots>false</overWriteSnapshots>
                <overWriteIfNewer>true</overWriteIfNewer>
            </configuration>
        </execution>
    </executions>
</plugin>

其中 <outputDirectory>${project.build.directory}/locallib</outputDirectory> 就是指定war所以依赖的lib包存放目录,与所打的war 在同一级目录

<think>我们正在讨论Maven项目中如何将依赖包输出到指定目录的问题。根据用户提供的引用内容,特别是引用[3]、[4]、[5],我们可以总结出几种方法。 用户的问题:Maven打包如何指定依赖包输出到哪个目录? 解决方案: 1. 使用maven-dependency-plugin插件将依赖复制到指定目录(引用[5]提供了配置示例,引用[4]展示了Spring Boot项目打包依赖输出到lib目录的效果)。 2. 使用distributionManagement将构建结果部署到指定目录(引用[3]),但注意这通常用于发布到仓库,而不是在构建过程中输出依赖包。 3. Spring Boot项目可以通过配置spring-boot-maven-plugin将依赖打包到BOOT-INF/lib目录(引用[4]),但用户可能希望输出到自定义目录。 下面我们重点介绍两种常用方法方法一:使用maven-dependency-plugin插件复制依赖指定目录 在pom.xml中配置该插件,在package阶段执行copy-dependencies目标,将依赖复制到指定目录方法二:对于Spring Boot项目,使用spring-boot-maven-plugin打包,默认会将依赖打包到BOOT-INF/lib目录下(在jar包内)。如果希望将依赖单独提取到外部目录,则仍需要借助maven-dependency-plugin。 根据用户需求,我们重点介绍方法一(通用方法)和方法二(Spring Boot项目)的配置。 具体步骤: 一、通用方法(适用于任何Maven项目) 在pom.xml的build/plugins部分添加maven-dependency-plugin插件配置: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <!-- 绑定到package阶段 --> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- 指定输出目录,可以使用Maven属性,如${project.build.directory}表示target目录 --> <outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 可选:是否包含项目自身构建的jar(通常不包括,因为这是依赖) --> <includeScope>runtime</includeScope> <!-- 默认是runtime,也可以指定为compile --> <!-- 可选:是否包含传递依赖,默认true --> <!-- 可选:排除某些组 --> <!-- <excludeGroupIds>...</excludeGroupIds> --> <!-- 可选:只包含某些组 --> <!-- <includeGroupIds>com.xxx.xxx</includeGroupIds> --> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 执行mvn package后,依赖包会被复制到target/lib目录下。 二、Spring Boot项目(将依赖打包到jar包内的lib目录,这是默认行为,无需额外配置) 但是,如果用户希望将依赖包输出到单独的目录(而不是嵌套在jar包内),则同样使用上述通用方法。 注意:在Spring Boot项目中,如果使用spring-boot-maven-plugin打包,会生成一个可执行jar,其中包含了所有依赖(在BOOT-INF/lib目录下)。如果用户需要将依赖单独提取出来,可以使用上述插件配置,将依赖复制到指定目录。 另外,引用[4]中提到的配置实际上是spring-boot-maven-plugin的默认行为,它会在打包依赖放入jar包内的lib目录。如果用户希望将依赖输出到外部目录(比如在target目录下单独存放),则使用maven-dependency-plugin。 三、扩展:将依赖和配置文件一起打包指定目录(如引用[2]所描述的需求) 有用户希望将依赖包、配置文件、以及项目构建的jar包分别放在指定目录结构下,然后通过脚本运行。我们可以结合maven-jar-plugin和maven-dependency-plugin来实现。 示例配置: 1. 使用maven-jar-plugin指定生成的jar包输出位置(默认在target目录,但我们可以复制到指定目录)。 2. 使用maven-dependency-plugin复制依赖指定目录。 3. 使用maven-resources-plugin复制配置文件到指定目录。 例如,假设我们希望将所有内容都放在target/output目录下,结构如下: output/ lib/ # 存放依赖jar包 config/ # 存放配置文件 app.jar # 项目构建的jar包 配置示例: ```xml <build> <plugins> <!-- 复制依赖到output/lib --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/output/lib</outputDirectory> <includeScope>runtime</includeScope> </configuration> </execution> </executions> </plugin> <!-- 复制配置文件到output/config --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>copy-resources</id> <phase>package</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/output/config</outputDirectory> <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <!-- 是否替换资源文件中的占位符 --> </resource> </resources> </configuration> </execution> </executions> </plugin> <!-- 配置生成的jar包的位置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.2.0</version> <configuration> <outputDirectory>${project.build.directory}/output</outputDirectory> <!-- 指定Manifest文件,如果需要的话,特别是可执行jar需要指定主类 --> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <!-- 指定类路径前缀为lib/,这样在运行jar会在lib目录下找依赖 --> <mainClass>com.example.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> ``` 这样,执行mvn package后,在target/output目录下就会生成我们需要的结构。 注意:如果使用spring-boot-maven-plugin,它会生成一个可执行jar(包含所有依赖),所以通常不需要单独复制依赖。但如果你需要分离依赖(比如为了灵活更新依赖或配置文件),则可以采用上述方式。 总结: 1. 使用maven-dependency-plugin复制依赖指定目录。 2. 结合其他插件(如maven-jar-plugin和maven-resources-plugin)可以将整个项目构建输出到自定义目录结构。 最后,验证:运行mvn package命令,检查目标目录是否按预期生成。 引用说明: [^3]:使用deploy命令部署到指定目录,或者使用maven-dependency-plugin导出依赖。 [^4]:Spring Boot项目打包依赖到lib目录(在jar包内部)。 [^5]:使用maven-dependency-plugin插件配置输出目录。 相关问题: 1. 如何将Maven项目的配置文件单独输出到指定目录? 2. Spring Boot项目如何分离依赖包和可执行jar? 3. 如何配置Maven将构建的jar包输出到指定目录? 4. Maven中如何过滤资源文件中的占位符? 5. 如何创建一个可执行的jar包,并指定外部依赖目录?</think>### Maven打包指定依赖包输出目录方法Maven项目中,可以通过以下方法控制依赖包输出到指定目录: --- ### 方法一:使用maven-dependency-plugin插件(推荐) 在pom.xml中添加配置,将依赖包复制到自定义目录: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.6.1</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <!-- 绑定到打包阶段 --> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <!-- 指定输出目录 --> <outputDirectory>${project.build.directory}/custom-lib</outputDirectory> <!-- 可选:包含特定分组 --> <includeGroupIds>com.example.*</includeGroupIds> <!-- 可选:排除测试依赖 --> <includeScope>runtime,compile</includeScope> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 执行`mvn package`后,依赖包将输出到`target/custom-lib`目录[^5][^4]。 --- ### 方法二:Spring Boot项目配置 在Spring Boot项目中,通过spring-boot-maven-plugin配置: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 指定依赖输出目录 --> <outputDirectory>${project.build.directory}/external-lib</outputDirectory> <!-- 生成包含依赖的独立jar --> <layout>ZIP</layout> </configuration> </plugin> </plugins> </build> ``` 打包依赖将放在`target/external-lib`目录[^4]。 --- ### 方法三:部署到本地目录 使用distributionManagement部署到本地路径: ```xml <distributionManagement> <repository> <id>local-repo</id> <url>file:///D:/maven-repo</url> <!-- 本地目录路径 --> </repository> </distributionManagement> ``` 执行`mvn deploy`将依赖包部署到指定目录[^3]。 --- ### 验证输出 1. 执行打包命令: ```bash mvn clean package ``` 2. 检查输出目录: ```bash ls target/custom-lib # 应显示所有依赖jar包 ``` --- ### 配置说明 | 参数 | 说明 | 示例 | |------|------|------| | `<outputDirectory>` | 输出目录路径 | `target/my-lib` | | `<includeGroupIds>` | 包含的分组ID | `com.example.*` | | `<excludeGroupIds>` | 排除的分组ID | `junit.*` | | `<includeScope>` | 包含的作用域 | `runtime` | | `<overWriteReleases>` | 覆盖已存在版本 | `true` | --- ### 典型应用场景 1. **分离配置与依赖**:将配置文件放在`/config`目录依赖包放在`/lib`目录[^2] 2. **容器化部署**:在Docker镜像中分层存放依赖 3. **热更新支持**:不修改主JAR即可更新依赖 4. **多环境部署**:不同环境使用不同依赖版本 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值