【问题标题】:Force java.net.preferIPv4Stack to true强制 java.net.preferIPv4Stack 为 true
【发布时间】:2017-05-03 13:29:54
【问题描述】:
我目前正在开发一个暗示多播连接的 Java 应用程序。
我的开发机器是 Mac,连接到多播组时遇到问题。我通过添加参数-Djava.net.preferIPv4Stack=true 来修复它是我的运行配置。我无法在运行时将此属性设置为 true,因为 JVM 在启动时读取它一次,而不是在运行时。
我的问题是,当我发布我的应用程序时,我希望用户只需“双击”图标,它就会毫无问题地启动,即使用户使用的是 Windows、Mac 或任何 Linux 发行版。
所以我的问题是,如何强制 JVM 使用此参数启动 .jar?有没有办法告诉 maven 这样做?
在此先感谢
【问题讨论】:
标签:
java
maven
jar
system-properties
【解决方案1】:
由于这是在maven中标记的,
您可以通过脚本传递此类 JVM 参数。
因此,为每种类型的机器创建一个启动脚本。就像 Windows 的 unix start.bat 的 start.sh 一样。
使用 maven 配置文件将正确的机器相关脚本复制到最终工件目录,即目标目录。
【解决方案2】:
至少对于 Mac,Minecraft 也会出现同样的问题。您可以通过 app bundle 中的 Info.plist 文件强制使用 Java 标志。
它看起来像这样......
</dict>
</plist>
<key>NSHighResolutionCapable</key>
<string>YES</string>
<!-- ######## ADD ONLY CONTENT BELOW THIS LINE ######## -->
<key>LSEnvironment</key>
<dict>
<key>_JAVA_OPTIONS</key>
<string>-Djava.net.preferIPv4Stack=true</string>
</dict>
<!-- ######## ADD ONLY CONTENT ABOVE THIS LINE ######## -->
</dict>
</plist>
对于 Windows,您可以通过启动脚本或设置 _JAVA_OPTIONS=-Djava.net.preferIPv4Stack=true 的桌面安装程序设置用户环境变量。
技术取自这里提供了更全面的解释:https://gaming.stackexchange.com/a/320864/199492
如果您尝试直接从jar 执行此操作,您将需要一个存根来检测并重新启动具有覆盖设置的 Java。这不是微不足道的,但可以使用一些 Java 工具结合Runtime.exec(...) 和提供的参数来完成。
长话短说,如果您分发 Java 应用程序,您应该分发适当的启动器(通常是安装程序),以便您可以控制这些类型的东西。