文章目录
将普通Eclipse项目改造为Maven项目(非SpringBoot项目)
Maven安装与配置
网上资料很多,可自行搜索,不再赘述。
项目结构改造
需要将普通Eclipse项目结构改造为Maven标准结构,如下
txt
src/
|--main/
|--java/
|--resources/
多模块项目结构
txt
Demo/
|--module1/
|--java/
|--resources/
|--pom.xml
|--module2/
|--java/
|--resources/
|--pom.xml
|--module3/
|--java/
|--resources/
|--pom.xml
|--pom.xml
父子Pom.xml文件配置(继承与集成)
父项目下的pom.xml文件配置
注意事项:
- 为了方便管理子模块的依赖,防止出现依赖冲突,在这里配置好所有模块的依赖项,后面等所有模块配置好后会一起下载依赖项
- 按子模块间的依赖顺序集成子模块,作为后续构建jar包的打包顺序
- 可配置下载依赖的Maven仓库地址
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>
<!-- GAV坐标 -->
<groupId>com.regan</groupId> <!-- 公司或组织ID -->
<artifactId>Demo</artifactId> <!-- 项目模块ID -->
<version>1.0.0</version> <!-- 版本号 -->
<packaging>pom</packaging> <!-- 打包形式,pom工程 -->
<name>Demo</name> <!-- 项目名称 -->
<description>Demo</description><!-- 项目描述 -->
<!-- 自定义属性 -->
<properties>
<!-- 应用版本号 -->
<demo.version>1.0.0</demo.version>
<!-- 编译版本 -->
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<!-- 编码格式 -->
<project.build.sourceEncoding>GBK</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- Java版本 -->
<java.version>1.8</java.version>
<!-- 第三方库版本 -->
<dom4j.version>2.1.3</dom4j.version>
<fastjson2.version>2.0.53</fastjson2.version>
<gson.version>2.8.9</gson.version>
<log4j-core.version>1.2.17</log4j-core.version>
<junit.version>5.9.2</junit.version>
<!-- 外部资源路径 -->
<external-resources-path>${project.basedir}/../..</external-resources-path>
<!-- maven插件 -->
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
<maven-jar-plugin.version>3.3.0</maven-jar-plugin.version>
<maven-shade-plugin.version>3.2.4</maven-shade-plugin.version>
<maven-dependency-plugin.version>3.6.0</maven-dependency-plugin.version>
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
</properties>
<!-- 依赖项管理 -->
<dependencyManagement>
<dependencies>
<!-- xml解析 -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
</dependency>
<!-- 阿里json解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
</dependency>
<!-- json-java object 转换 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>${gson.version}</version>
</dependency>
<!-- 日志记录工具 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j-core.version}</version>
</dependency>
<!-- 编写测试的API -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- 基础模块 -->
<dependency>
<groupId>com.regan</groupId>
<artifactId>module1</artifactId>
<version>${demo.version}</version>
</dependency>
<!-- 基础工具模块 -->
<dependency>
<groupId>com.regan</groupId>
<artifactId>module2</artifactId>
<version>${demo.version}</version>
</dependency>
<!-- 核心模块 -->
<dependency>
<groupId>com.regan</groupId>
<artifactId>module3</artifactId>
<version>${demo.version}</version>
</dependency>
<!-- 启动模块 -->
<dependency>
<groupId>com.regan</groupId>
<artifactId>demo</artifactId>
<version>${demo.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子模块,根据依赖顺序排序 -->
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
<module>demo</module>
</modules>
<!-- 统一管理插件版本 -->
<build>
<!-- 打包后的Jar包名称 -->
<finalName>Demo-${project.artifactId}-${demo.version}</finalName>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<!-- 仓库 -->
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<!-- 插件仓库 -->
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
普通子模块下的pom.xml配置
注意事项
- 注意要继承parent
- 依赖的其它模块也要写上
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">
<!-- 继承父级 -->
<parent>
<groupId>com.regan</groupId>
<artifactId>Demo</artifactId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging> <!-- 子模块打包成Jar包 -->
<artifactId>module2</artifactId>
<description>基础模块</description>
<dependencies>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
</dependency>
<!-- 依赖的其它模块 -->
<dependency>
<groupId>com.regan</groupId>
<artifactId>module1</artifactId>
</dependency>
</dependencies>
</project>
启动模块的pom.xml配置
注意事项
-
启动模块需要配置程序入口
-
在这里进行打包配置(依赖、资源文件)
-
如果所依赖的资源路径在项目执行路径之外(${project.basedir}),就需要在打包配置时使用
${project.basedir}/..
--相当于执行路径下的上一级目录xml<resources> <resource> <directory>你的资源路径</directory> </resource> </resources>
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">
<parent>
<groupId>com.regan</groupId>
<artifactId>Demo</artifactId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>jar</packaging>
<artifactId>module3</artifactId>
<properties>
<external-resources-path>${project.basedir}/../..</external-resources-path>
</properties>
<description>启动模块</description>
<dependencies>
<!-- xml解析 -->
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>${dom4j.version}</version>
<scope>system</scope>
<systemPath>${external-resources-path}/safri_build/dom4j-2.1.1.jar</systemPath>
</dependency>
<!-- 日志记录工具 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j-core.version}</version>
<scope>system</scope>
<systemPath>${external-resources-path}/safri_build/log4j-1.2.17.jar</systemPath>
</dependency>
<!-- json库 -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>${json.version}</version>
<scope>system</scope>
<systemPath>${external-resources-path}/safri_build/json.jar</systemPath>
</dependency>
<!-- 语法高亮文本编辑器 -->
<dependency>
<groupId>com.fifesoft</groupId>
<artifactId>rsyntaxtextarea</artifactId>
<version>${rsyntaxtextarea.version}</version>
<scope>system</scope>
<systemPath>${external-resources-path}/safri_build/rsyntaxtextarea-3.5.3.jar</systemPath>
</dependency>
<!-- 阿里json解析器 -->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>${fastjson2.version}</version>
<scope>system</scope>
<systemPath>${external-resources-path}/safri_build/fastjson2-2.0.53.jar</systemPath>
</dependency>
<dependency>
<groupId>com.regan</groupId>
<artifactId>module1</artifactId>
</dependency>
<dependency>
<groupId>com.regan</groupId>
<artifactId>module2</artifactId>
</dependency>
</dependencies>
<!-- 配置可执行Jar -->
<build>
<!-- 可选:配置从指定目录下开始编译,不拘泥于Maven结构-- <sourceDirectory>src</sourceDirectory> -->
<plugins>
<!-- 1. 生成主JAR(不含依赖) -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>cnpo.Demo.app.ApplicationEntrance</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- 2. 复制所有依赖到target/lib -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>${maven-dependency-plugin.version}</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<includeScope>runtime</includeScope>
<includeScope>system</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<!-- 3. 处理资源文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resources-plugin.version}</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>process-resources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}</outputDirectory>
<resources>
<!-- 资源1 目录 -->
<resource>
<directory>${external-resources-path}/images</directory>
<excludes>
<exclude>**/*.webg</exclude>
</excludes>
<targetPath>images</targetPath>
</resource>
<!-- config 目录 -->
<resource>
<directory>${external-resources-path}/config</directory>
<includes>
<include>**/*.*</include>
</includes>
<targetPath>config</targetPath>
</resource>
<!-- 单个文件 -->
<resource>
<directory>${external-resources-path}/</directory> <!-- 指向父目录 -->
<includes>
<include>*.properties</include>
<include>admin.txt</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
多模块编译
进行多模块编译主要就是需要在父类pom.xml文件中配置好modules
,各子模块的pom.xml文件中配置好依赖模块和依赖包,最后在启动模块下进行Maven插件的配置。可参考上述pom.xml配置文件。
还需要注意的一点是依赖配置:
- 若使用
<systemPath>
,需在所有依赖模块中显式重复配置该依赖。
xml
<scope>system</scope>
<systemPath>依赖包路径</systemPath>
注意:这种依赖作用域默认没有依赖传递。
总结
Maven多模块项目主要就是注意父类Pom.xml文件与子模块Pom.xml文件的模块包含关系,以及依赖配置。
Maven插件配置
以下是对Maven核心插件的详细介绍,涵盖参数配置、使用场景及注意事项:
一、maven-compiler-plugin
功能
负责Java源代码的编译,控制编译版本、编码、内存分配等。
常用参数
<source>
:指定源代码兼容的Java版本(如1.8)。<target>
:指定生成的字节码目标JVM版本。<encoding>
:设置字符编码(默认UTF-8)。<fork>
:是否启用独立进程编译(默认false)。<compilerArgs>
:传递额外编译器参数(如-Xlint:unchecked
)。<showWarnings>
:是否显示编译警告(默认false)。<release>
:兼容特定JDK版本(仅JDK9+支持)。
配置示例
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<arg>-Xlint:all</arg>
</compilerArgs>
</configuration>
</plugin>
注意事项
- 版本兼容性 :
<release>
参数仅JDK9+支持,低版本需用<source>
/<target>
。 - 目标JVM限制 :即使设置
<target>
为低版本,仍需避免使用高版本API,建议配合bootclasspath
或Animal Sniffer插件验证。
二、maven-jar-plugin
功能
生成标准JAR包,配置清单文件(MANIFEST.MF)。
常用参数
<archive>
:配置JAR包元数据。<manifest>
:定义主类、类路径等。
<mainClass>
:指定入口类。<addClasspath>
:是否添加类路径(默认false)。<classpathPrefix>
:类路径前缀(如lib/
)。
<excludes>
/<includes>
:排除或包含特定文件。
配置示例
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.example.Main</mainClass>
</manifest>
</archive>
<excludes>
<exclude>**/test/**</exclude>
</excludes>
</configuration>
</plugin>
注意事项
- 依赖管理 :不会打包依赖库,需配合
maven-dependency-plugin
复制依赖到类路径目录。 - 版本冲突:若配置不生效,检查插件版本与Maven/JDK兼容性。
三、maven-dependency-plugin
功能
管理项目依赖,如复制依赖、生成依赖树。
常用参数
<copy-dependencies>
目标 :<outputDirectory>
:依赖复制目标目录(如target/lib
)。<excludeTransitive>
:是否排除传递依赖(默认false)。<stripVersion>
:移除依赖版本号(默认false)。
<dependency:tree>
:生成依赖树分析。
配置示例
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.0</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<stripVersion>true</stripVersion>
</configuration>
</execution>
</executions>
</plugin>
注意事项
- 参数兼容性 :避免使用旧版本参数(如
overwrite
),推荐使用<overWriteIfNewer>
。 - 依赖范围 :通过
<includeScope>
控制复制范围(如runtime
)。
四、maven-resources-plugin
功能
处理资源文件,支持过滤、编码、动态替换占位符。
常用参数
<encoding>
:资源文件编码(默认${project.build.sourceEncoding}
)。<resources>
:定义资源目录及过滤规则。<filtering>
:是否启用占位符替换(默认false)。
<excludes>
/<includes>
:排除或包含特定资源文件。<escapeString>
:转义占位符前缀(如\${}
避免替换)。
配置示例
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<encoding>UTF-8</encoding>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>**/*.key</exclude>
</excludes>
</resource>
</resources>
</configuration>
</plugin>
注意事项
- 二进制文件过滤 :通过
<nonFilteredFileExtensions>
排除二进制文件(如PNG)。 - 目录覆盖 :默认包含
src/main/resources
,自定义资源目录需显式声明。
五、maven-shade-plugin
功能
生成包含依赖的"胖JAR"(Uber-JAR),解决依赖冲突。
常用参数
<transformers>
:合并资源文件(如ManifestResourceTransformer
)。<mainClass>
:指定入口类。
<filters>
:排除签名文件(如META-INF/*.SF
)。<relocations>
:重定位类路径以避免冲突(如com.google.guava
→shaded.com.google.guava
)。<createDependencyReducedPom>
:是否生成精简POM(默认true)。
配置示例
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.Main</mainClass>
</transformer>
</transformers>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
注意事项
- 资源冲突 :多个依赖包含同名资源时需手动合并(如
AppendingTransformer
)。 - 体积控制 :通过
<minimizeJar>
移除未使用的类,但可能破坏反射。
六、maven-assembly-plugin
功能
生成自定义分发包(如ZIP/TAR),包含脚本、配置文件等。
常用参数
<descriptorRefs>
:使用预定义描述符(如jar-with-dependencies
)。<descriptors>
:引用自定义assembly.xml
文件。<archive>
:配置清单文件(如Main-Class
)。<formats>
:指定打包格式(如zip、tar.gz)。
配置示例
xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/custom.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
自定义assembly.xml
示例
xml
<assembly>
<id>full-distribution</id>
<formats>
<format>zip</format>
</formats>
<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>src/main/scripts</directory>
<outputDirectory>/bin</outputDirectory>
</fileSet>
</fileSets>
</assembly>
注意事项
- 路径控制 :
<includeBaseDirectory>
决定是否将文件放入顶级目录。 - 依赖管理 :通过
<dependencySets>
控制依赖的打包方式(如解压或直接复制)。
总结
插件 | 核心用途 | 典型场景 |
---|---|---|
maven-compiler-plugin | 控制编译过程 | 多版本JDK兼容、编码调整 |
maven-jar-plugin | 生成标准JAR包 | 可执行JAR、类路径配置 |
maven-dependency-plugin | 依赖管理 | 依赖复制、依赖树分析 |
maven-resources-plugin | 资源文件处理 | 配置文件过滤、编码统一 |
maven-shade-plugin | 生成胖JAR | 微服务部署、依赖冲突解决 |
maven-assembly-plugin | 定制化打包分发 | 包含脚本/配置的完整发布包 |
通过合理配置这些插件,可实现从编译到分发的全流程控制,满足复杂项目需求。