You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在pom.xml中配置IPv4优先的VM参数?

如何在Maven中配置,让Jar包自动优先使用IPv4

当然可以!你完全可以通过Maven的打包插件配置,把-Djava.net.preferIPv4Stack=true这个JVM参数整合到打包流程里,这样其他人拿到Jar包后,不用手动加参数就能自动以IPv4优先的方式运行。下面给你几种实用的方案,按需选择:

方案一:直接在代码里设置(最省心)

虽然不是修改pom.xml,但这是最直接有效的方式——在你的主类的main方法第一行加上这句代码:

System.setProperty("java.net.preferIPv4Stack", "true");

这样不管用户是用java -jar还是其他方式运行Jar,这个系统属性都会被自动设置,彻底避免了参数遗漏的问题。

方案二:用Maven Assembly插件生成带启动脚本的压缩包

如果你希望保留原Jar的结构,同时给用户提供一键启动的方式,可以用这个插件生成包含Jar包和启动脚本的zip/tar包,脚本里已经帮用户写好了JVM参数。配置步骤如下:

  1. 在pom.xml里添加插件配置:
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.6.0</version>
      <configuration>
        <!-- 生成包含所有依赖的胖Jar -->
        <descriptorRefs>
          <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
          <manifest>
            <!-- 替换成你自己的主类全路径 -->
            <mainClass>com.yourcompany.yourapp.MainClass</mainClass>
          </manifest>
        </archive>
        <!-- 指定自定义的装配描述文件 -->
        <descriptors>
          <descriptor>src/main/assembly/assembly.xml</descriptor>
        </descriptors>
      </configuration>
      <executions>
        <execution>
          <id>package-assembly</id>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  1. 在src/main/assembly目录下创建assembly.xml文件,定义打包结构:
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.1.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.1.0 http://maven.apache.org/xsd/assembly-2.1.0.xsd">
  <id>bin</id>
  <!-- 生成zip和tar.gz两种格式的压缩包 -->
  <formats>
    <format>zip</format>
    <format>tar.gz</format>
  </formats>
  <fileSets>
    <!-- 把生成的胖Jar包加入压缩包 -->
    <fileSet>
      <directory>${project.build.directory}</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>${project.build.finalName}-jar-with-dependencies.jar</include>
      </includes>
    </fileSet>
    <!-- 把启动脚本加入压缩包 -->
    <fileSet>
      <directory>src/main/scripts</directory>
      <outputDirectory>/</outputDirectory>
      <includes>
        <include>start.sh</include>
        <include>start.bat</include>
      </includes>
      <!-- 给脚本设置可执行权限 -->
      <fileMode>0755</fileMode>
    </fileSet>
  </fileSets>
</assembly>
  1. 在src/main/scripts目录下创建两个启动脚本:
  • Linux/Mac 用的start.sh:
#!/bin/bash
# 替换成你的Jar包名称
java -Djava.net.preferIPv4Stack=true -jar your-app-jar-with-dependencies.jar
  • Windows 用的start.bat:
@echo off
java -Djava.net.preferIPv4Stack=true -jar your-app-jar-with-dependencies.jar

执行mvn package后,target目录里会生成带-bin后缀的压缩包,用户解压后直接运行对应系统的启动脚本就行,完全不用管参数的事。

方案三:用Maven Shade插件生成带启动器的胖Jar

如果你想生成一个独立的可执行Jar,同时自动设置IPv4优先,可以用Shade插件配合一个自定义的启动器类:

  1. 在pom.xml里配置Shade插件:
<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.4.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <transformers>
              <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                <!-- 把自定义启动器设为Jar的主类 -->
                <mainClass>com.yourcompany.yourapp.IPv4PreferLauncher</mainClass>
              </transformer>
            </transformers>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  1. 创建自定义启动器类IPv4PreferLauncher:
package com.yourcompany.yourapp;

public class IPv4PreferLauncher {
    public static void main(String[] args) {
        // 先设置IPv4优先的系统属性
        System.setProperty("java.net.preferIPv4Stack", "true");
        // 再调用原来的主类启动程序
        MainClass.main(args);
    }
}

这样生成的胖Jar,用户直接运行java -jar your-app.jar时,会先执行启动器设置系统属性,再启动你的主程序,全程不需要手动加参数。

内容的提问来源于stack exchange,提问作者Jeredriq Demas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:38:15