普通项目与Maven项目差异

直接先上图,使用IDEA创建的普通JAVA项目结构如下:

idea java项目 module idea java项目转maven项目_spring


可以看到普通java项目除了一个src及配置信息外,空空如也。通过IDEA工具创建Maven项目

idea java项目 module idea java项目转maven项目_intellij-idea_02


创建的项目结构如下:

idea java项目 module idea java项目转maven项目_java_03


多了一个pom.xml文件,并且src文件夹中自动创建了main/java、main/resources等文件夹,方便管理。很明显使用maven来管理项目更加方便管理。同样各种开发环境都有各种的包管理工具,如PHP中会使用Composer,nodejs使用npm,android开发常用Gradle方式来进行包依赖管理。

如何在IDEA中转换普通项目

由于之前项目是普通项目,所以需要将其转换为Maven项目,在IDEA实现转换很简单,主要有以下方法:

添加Maven支持:

右键选项 “Add Framework Support”,如下:

idea java项目 module idea java项目转maven项目_maven_04


然后设置maven相关信息:

idea java项目 module idea java项目转maven项目_maven_05


最后编辑下pom.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>

    <groupId>jstudy.mybatis</groupId>
    <artifactId>java-mybatis-tiny</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>14</maven.compiler.source>
        <maven.compiler.target>14</maven.compiler.target>
    </properties>
    
</project>

至此,转换完毕。

添加pom.xml文件转换

在项目根目录下添加pom.xml,并将上面内容粘贴,IDE工具将会自动识别maven项目,然后点击同步下项目:

idea java项目 module idea java项目转maven项目_maven_06


转换完毕。

pom.xml文件说明

由于使用maven管理项目,顺便将pom.xml文件配置详解记录一下:

<!-- project 根描述符 -->
<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">
    <!-- 指定maven版本,一般为4.0.0 -->
    <modelVersion>4.0.0</modelVersion>


    <!-- 基本配置 -->
    <!-- 继承功能,可以指定父POM -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.4</version>
        <!-- 指定父项目搜索路径,一般远程项目或者仓库无需配置 -->
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <!-- 一般jar包为: groupId:artifactId:version -->
    <!-- 团体、组织标书符,项目的命名空间 -->
    <groupId>org.example</groupId>
    <!-- 项目唯一标识符,不能含有点号(.) -->
    <artifactId>learn-pom</artifactId>
    <!-- 版本号,可以实用特殊字符串 SNAPSHOT、LATEST、RELEASE -->
    <!-- SNAPSHOT: 用于开发过程中,表示不稳定版本 -->
    <!-- LATEST: 表示特定构建的最新发布版本 -->
    <!-- RELEASE: 最有一个稳定的发布版本 -->
    <version>1.0-SNAPSHOT</version>
    <!-- 项目打包类型,默认jar,常见类型:pom, jar, maven-plugin, ejb, war, ear, rar, par -->
    <packaging>jar</packaging>
    <!-- 项目依赖 -->
    <dependencies>
        <!-- 依赖节点 -->
        <dependency>
            <!-- 与方面解释一样 -->
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
            <!-- 对应使用的打包类型,默认为jar -->
            <type>jar</type>
            <!-- 指任务的类路径及依赖关系传递性,包括 compile(默认)、provided、runtime、test、system -->
            <!-- compile: 默认范围,在所有classpath级依赖项目都可使用 -->
            <!-- provided: 编译和测试可用,但不可传递 -->
            <!-- runtime: 字面意,只在运行和测试时有效 -->
            <!-- test: 测试和执行阶段有效,不是传递的 -->
            <!-- system: 除特殊指定,始终可用,与systemPath结合使用 -->
            <scope>test</scope>
            <!-- scope为system时有效 -->
            <systemPath></systemPath>
            <!-- 可选项,无需此依赖运行 -->
            <optional>true</optional>
            <!-- 排除一个或多个元素 -->
            <exclusions>
                <exclusion>
                    <groupId>io.springfox</groupId>
                    <artifactId>springfox-boot-teseter</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
    <!-- 多项目(子父项目)中方便依赖管理,保证版本一致,父项目中使用,声明依赖,但不引用,子项目中可以不加版本,使用父项目中配置 -->
    <dependencyManagement></dependencyManagement>
    <!-- 声明变量,如果后面用到可使用${变量名}来替代 -->
    <properties>
        <sf.version>2.0.0</sf.version>
    </properties>
    <!-- 多模块管理 -->
    <modules>
        <module>project-1</module>
        <module>project-2</module>
        <module>project-3</module>
    </modules>

    <!-- 构建设置 -->
    <!-- 包括project build、profile build -->
    <build>
        <!-- 执行目标 -->
        <defaultGoal>install</defaultGoal>
        <!-- 构建目标目录 -->
        <directory>${basedir}/target</directory>
        <!-- 各种默认路径及默认值 -->
        <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
        <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
        <outputDirectory>${basedir}/target/classes</outputDirectory>
        <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
        <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
        <!-- 项目最终构建名称 -->
        <finalName>myproject-SNAPSHOT</finalName>
        <!-- 过滤资源信息 -->
        <filters>
            <filter>myproject.properties</filter>
        </filters>
        <!-- 扩展插件 -->
        <extensions>
            <extension>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.30</version>
            </extension>
        </extensions>
        <!-- 使用插件 -->
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <!-- 是否加载插件扩展名 -->
                <extensions>false</extensions>
                <!-- 是否可继承 -->
                <inherited>true</inherited>
                <!-- 插件本身需要的依赖 -->
                <dependencies></dependencies>
                <!-- 插件配置 -->
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
                <!-- 指定插件不同的目标 -->
                <executions>
                    <execution>
                        <!-- 目标标识 -->
                        <id>tester</id>
                        <!-- 目标列表 -->
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <!-- 是否继承 -->
                        <inherited>false</inherited>
                        <!-- 特定配置 -->
                        <configuration></configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <!-- 与dependencyManagement类似,为了统一版本 -->
        <pluginManagement></pluginManagement>
    </build>
    <!-- 针对site生成报告插件,与build内插件类似 -->
    <reporting>
        <plugins></plugins>
    </reporting>

    <!-- 项目信息,一般不用填写 -->
    <!-- 项目名称 -->
    <name>learn pom</name>
    <!-- 描述 -->
    <description>just learn pom project</description>
    <!-- 开始年份 -->
    <inceptionYear>2020</inceptionYear>
    <!-- 项目地址 -->
    <url>https://github.com/</url>
    <!-- 使用协议 -->
    <licenses>
        <license>
            <!-- 使用协议 -->
            <name>My License</name>
            <!-- 分发方式 -->
            <distribution>github</distribution>
            <!-- 协议地址 -->
            <url>https://github.com/</url>
            <!-- 注释 -->
            <comments>Just my License</comments>
        </license>
    </licenses>
    <!-- 组织信息 -->
    <organization>
        <!-- 组织名称 -->
        <name>My Cor</name>
        <!-- 组织链接 -->
        <url>https://github.com/</url>
    </organization>
    <!-- 开发者列表 -->
    <developers>
        <developer>
            <id>master</id>
            <name>hunkxia</name>
            <email>hunk.xia@gmail.com</email>
            <organization>My Cor</organization>
            <organizationUrl>https://github.com/</organizationUrl>
            <!-- 开发者角色列表 -->
            <roles>
                <role>master</role>
            </roles>
            <!-- 开发者其它信息 -->
            <properties></properties>
        </developer>
    </developers>
    <!-- 贡献者列表 -->
    <contributors></contributors>

    <!-- 环境设置 -->
    <!-- 缺陷提交讨论地址 -->
    <issueManagement>
        <!-- 缺陷跟踪系统 -->
        <system>iss</system>
        <url>https://github.com/</url>
    </issueManagement>
    <!-- 构建系统配置 -->
    <ciManagement>
        <!-- 构建系统类型 -->
        <system>cis</system>
        <!-- 构建地址 -->
        <url>https://github.com/</url>
        <!-- 通知人列表 -->
        <notifiers>
            <notifier>
                <type>mail</type>
                <sendOnError>true</sendOnError>
                <sendOnFailure>true</sendOnFailure>
                <sendOnSuccess>true</sendOnSuccess>
                <sendOnWarning>true</sendOnWarning>
                <address>hunk.xia@gmail.com</address>
                <!-- 通知配置 -->
                <configuration></configuration>
            </notifier>
        </notifiers>
    </ciManagement>
    <!-- 邮件列表 -->
    <mailingLists>
        <!-- 列表信息 -->
        <mailingList>
            <name>list-1</name>
            <subscribe></subscribe>
            <unsubscribe></unsubscribe>
            <post></post>
            <archive></archive>
            <otherArchives></otherArchives>
        </mailingList>
    </mailingLists>
    <!-- 源代码版本控制 -->
    <scm>
        <connection></connection>
        <developerConnection></developerConnection>
        <tag>HEAD</tag>
        <url></url>
    </scm>
    <!-- 预处理操作 -->
    <prerequisites></prerequisites>
    <!-- 仓库库配置,可以用来设置远程仓库 -->
    <repositories>
        <repository>
            <id>my repos</id>
            <name>My Repository</name>
            <url>http://repo.myrepos.cn/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>daily</updatePolicy>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <checksumPolicy>warn</checksumPolicy>
            </snapshots>
            <layout>default</layout>
        </repository>
    </repositories>
    <!-- 插件仓库 -->
    <pluginRepositories></pluginRepositories>
    <!-- 发布管理,管理整个构建 -->
    <distributionManagement>
        <repository></repository>
        <site></site>
        <downloadUrl></downloadUrl>
        <status></status>
    </distributionManagement>
    <!-- 配置不同环境,不同包 -->
    <profiles>
        <profile>
            <id>release</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*</include>
                        </includes>
                    </resource>
                </resources>
            </build>
        </profile>

        <profile>
            <id>test</id>
            <build>
                <resources>
                    <resource>
                        <directory>src/test/resources</directory>
                        <includes>
                            <include>config/*.properties</include>
                            <include>log4j.xml</include>
                        </includes>
                    </resource>
                    <resource>
                        <directory>src/main/resources</directory>
                        <includes>
                            <include>**/*.xml</include>
                        </includes>
                        <excludes>
                            <exclude>log4j.xml</exclude>
                        </excludes>
                    </resource>
                </resources>
            </build>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
    </profiles>
</project>

本篇完,下次再深入讲解和研究下多项目(父子项目、依赖项目)如何规范配置。