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

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

相关推荐
不吃香菜学java1 小时前
苍穹外卖-新增菜品需求分析
java·spring boot·spring·tomcat·maven·ssm
smile_life_1 小时前
使用idea查看maven依赖
java·maven·intellij-idea
冬天豆腐3 小时前
Springcloud,Nacos管理,打jar包后,启动报错
java·spring cloud·maven·jar
zhougl9964 小时前
maven 插件
java·maven
爱吃山竹的大肚肚5 小时前
依赖冲突快速解决
java·spring boot·后端·spring cloud·maven
aisifang006 小时前
SpringBoot Maven 项目 pom 中的 plugin 插件用法整理
spring boot·后端·maven
BioRunYiXue6 小时前
甘油不够了,能用植物油保存菌种吗?
java·linux·运维·服务器·网络·人工智能·eclipse
zhougl9967 小时前
Maven build配置
java·linux·maven
Predestination王瀞潞8 小时前
2.2 依赖管理Maven工具->dependency详解:Maven 依赖核心标签完整详解
java·maven
空空潍21 小时前
保姆级实战教程:Maven私服Nexus搭建
java·maven·nexus