【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 定制化打包分发 包含脚本/配置的完整发布包

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

相关推荐
shane-u11 小时前
Maven私服搭建与登录全攻略
java·maven
半部论语11 小时前
jdk多版本切换,通过 maven 指定编译jdk版本不生效,解决思路
java·开发语言·maven·intellij-idea
七七-d11 小时前
配置Hadoop集群-上传文件
大数据·hadoop·eclipse
我喜欢山,也喜欢海14 小时前
Jenkins Maven 带权限 搭建方案2025
java·jenkins·maven
kaikaile199514 小时前
Jenkins集成Maven
servlet·jenkins·maven
.生产的驴15 小时前
Docker 部署Nexus仓库 搭建Maven私服仓库 公司内部仓库
java·运维·数据库·spring·docker·容器·maven
.生产的驴19 小时前
Maven 公司内部私服中央仓库搭建 局域网仓库 资源共享 依赖包构建共享
java·maven
Brilliant Nemo20 小时前
五、框架实战:SSM整合原理和实战
maven·mybatis
亮11121 小时前
GITLAB跑gradle项目 不借助maven-publish直接上传到nexus私人仓库
java·gitlab·gradle·maven
极小狐1 天前
极狐GitLab 通用软件包存储库功能介绍
java·数据库·c#·gitlab·maven