【Maven】将普通Eclipse项目改造为Maven项目(非SpringBoot项目)

文章目录

将普通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文件配置

注意事项:

  1. 为了方便管理子模块的依赖,防止出现依赖冲突,在这里配置好所有模块的依赖项,后面等所有模块配置好后会一起下载依赖项
  2. 按子模块间的依赖顺序集成子模块,作为后续构建jar包的打包顺序
  3. 可配置下载依赖的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配置

注意事项

  1. 注意要继承parent
  2. 依赖的其它模块也要写上
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配置

注意事项

  1. 启动模块需要配置程序入口

  2. 在这里进行打包配置(依赖、资源文件)

  3. 如果所依赖的资源路径在项目执行路径之外(${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源代码的编译,控制编译版本、编码、内存分配等。

常用参数

  1. <source>:指定源代码兼容的Java版本(如1.8)。
  2. <target>:指定生成的字节码目标JVM版本。
  3. <encoding>:设置字符编码(默认UTF-8)。
  4. <fork>:是否启用独立进程编译(默认false)。
  5. <compilerArgs> :传递额外编译器参数(如-Xlint:unchecked)。
  6. <showWarnings>:是否显示编译警告(默认false)。
  7. <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)。

常用参数

  1. <archive> :配置JAR包元数据。
    • <manifest>:定义主类、类路径等。
  • <mainClass>:指定入口类。
  • <addClasspath>:是否添加类路径(默认false)。
  • <classpathPrefix> :类路径前缀(如lib/)。
  1. <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

功能

管理项目依赖,如复制依赖、生成依赖树。

常用参数

  1. <copy-dependencies>目标
    • <outputDirectory> :依赖复制目标目录(如target/lib)。
    • <excludeTransitive>:是否排除传递依赖(默认false)。
    • <stripVersion>:移除依赖版本号(默认false)。
  2. <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

功能

处理资源文件,支持过滤、编码、动态替换占位符。

常用参数

  1. <encoding> :资源文件编码(默认${project.build.sourceEncoding})。
  2. <resources> :定义资源目录及过滤规则。
    • <filtering>:是否启用占位符替换(默认false)。
  3. <excludes> /<includes>:排除或包含特定资源文件。
  4. <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),解决依赖冲突。

常用参数

  1. <transformers> :合并资源文件(如ManifestResourceTransformer)。
    • <mainClass>:指定入口类。
  2. <filters> :排除签名文件(如META-INF/*.SF)。
  3. <relocations> :重定位类路径以避免冲突(如com.google.guavashaded.com.google.guava)。
  4. <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),包含脚本、配置文件等。

常用参数

  1. <descriptorRefs> :使用预定义描述符(如jar-with-dependencies)。
  2. <descriptors> :引用自定义assembly.xml文件。
  3. <archive> :配置清单文件(如Main-Class)。
  4. <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 定制化打包分发 包含脚本/配置的完整发布包

通过合理配置这些插件,可实现从编译到分发的全流程控制,满足复杂项目需求。

相关推荐
葡萄_成熟时_28 分钟前
JavaWeb后端基础(4)
java·开发语言·数据库·maven·web
葡萄_成熟时_2 小时前
JavaWeb后端基础(5)
java·开发语言·maven·web
计算机毕设定制辅导-无忧学长8 小时前
多模块 Maven 项目的管理(二)
java·log4j·maven
珹洺1 天前
Java-servlet(二)Java-servlet-Web环境搭建(上)IDEA,maven和tomcat工具下载(附Gitee直接下载)
java·运维·服务器·servlet·maven·intellij-idea
勿忘初心12211 天前
idea生成自定义Maven原型(archetype)项目工程模板
java·maven·intellij-idea
钰云空间2 天前
使用Maven搭建Spring Boot框架
java·后端·maven
wa的一声哭了2 天前
0x03 http协议和分层架构
java·网络协议·spring·http·架构·maven·mybatis
计算机毕设定制辅导-无忧学长2 天前
多模块 Maven 项目的管理(一)
java·python·maven
JJustRight2 天前
Maven入门教程
java·maven·idea