指定 Java 版本

以 Java 17 为例:

xml
pom.xml
1
2
3
4
5
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

或者按如下配置:

xml
pom.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.10.1</version>
            <configuration>
                <source>17</source>
                <target>17</target>
            </configuration>
        </plugin>
    </plugins>
</build>

打包文件输出到指定目录

Jar

可使用如下配置打包 Maven 工程,并将 jar 输出到指定目录下(以下示例为 bin/)。

关键节点是 outputDirectory,其他节点(如 archive)可删除。

xml
pom.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.2</version>
            <configuration>
                <outputDirectory>${project.build.directory}/bin</outputDirectory>
                <archive>
                    <addMavenDescriptor>false</addMavenDescriptor>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <mainClass>xxx.xxx.xxx</mainClass>
                        <classpathPrefix>lib/</classpathPrefix>
                    </manifest>
                </archive>
                <excludes>
                    <exclude>**/*.yml</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

Spring Boot 工程可使用如下方式:

xml
pom.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <outputDirectory>${project.build.directory}/bin</outputDirectory>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

项目依赖

可通过如下配置,将项目依赖在打包时输出到指定目录。(以下示例为 bin/lib

xml
pom.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <id>copy-dependencies-prod</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/bin/lib</outputDirectory>
                        <type>jar</type>
                        <includeTypes>jar</includeTypes>
                        <includeScope>runtime</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

其他资源

打包时如果需要一同输出其他文件(如启动 shell 脚本、yml 配置文件等)到指定目录,可参考如下配置:(以下示例为 bin/

xml
pom.xml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <execution>
                    <id>copy-shell-prod</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/bin</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${basedir}/shell</directory>
                                <includes>
                                    <include>*.sh</include>
                                </includes>
                            </resource>
                            <!-- 可以使用以下方式将 Jar 输出到指定目录 -->
                            <resource>
                                <directory>${project.build.directory}/bin</directory>
                                <includes>
                                    <include>*.jar</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
                <execution>
                    <id>copy-config-prod</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy-resources</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/bin/config</outputDirectory>
                        <resources>
                            <resource>
                                <directory>${basedir}/src/main/resources</directory>
                                <includes>
                                    <include>application-prod.yml</include>
                                </includes>
                            </resource>
                        </resources>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

本地 Jar 注册

当你有一个 Jar 文件想注册到本地仓库,可以使用如下命令:

shell
1
mvn install:install-file -Dfile=文件地址 -DgroupId=GroupId -DartifactId=ArtifactId -Dversion=Version -Dpackaging=jar

其中 文件地址GroupIdArtifactIdVersion 按实际情况填写即可。

HTTP 仓库报错问题

Maven 升级到 3.8.1 版本以后,默认将非 HTTPS 的远程仓库屏蔽掉了。可以通过如下方案解决:

  • 将 Maven 版本降到 3.8.1 以下(如 3.6.3)
  • 配置远程仓库支持 HTTPS 访问

package、install、deploy 的区别

打包一般使用如下三种命令:

  • mvn clean package:将项目打成 Jar 或 War 或其他形式的包
  • mvn clean install:在 package 的基础上,将生成的 Jar 包注册到本地仓库
  • mvn clean deploy:在 install 的基础上,将生成的 Jar 包推送到指定的远程仓库

其中 clean 为清空当前 target 目录。