如何在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参数。配置步骤如下:
- 在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>
- 在
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>
- 在
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插件配合一个自定义的启动器类:
- 在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>
- 创建自定义启动器类
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
相关产品推荐
相关产品推荐

