Java Gradle:强制另一个操作系统
我使用Java Gradle:强制另一个操作系统,java,gradle,build,Java,Gradle,Build,我使用OperatingSystem.current()处理gradle的日常工作。现在,我想为不同的平台组装我的java项目,所以我手动更改build.gradle文件以构建特定的操作系统 我的问题:有没有办法直接在gradle命令行中指定要使用的操作系统(由OperatingSystem.current()返回)?如果没有,交叉建设的最佳策略是什么 注意:我依赖于一些使用OperatingSystem.current()的库,写这篇文章时,我感到有些畏缩,这在很多方面都是错误的-我建议你不要
OperatingSystem.current()
处理gradle的日常工作。现在,我想为不同的平台组装我的java项目,所以我手动更改build.gradle文件以构建特定的操作系统
我的问题:有没有办法直接在gradle命令行中指定要使用的操作系统(由OperatingSystem.current()返回)?如果没有,交叉建设的最佳策略是什么
注意:我依赖于一些使用
OperatingSystem.current()
的库,写这篇文章时,我感到有些畏缩,这在很多方面都是错误的-我建议你不要强迫Gradle认为它在不同的操作系统中。
但假设你无法避免->
我完全取决于您使用的Gradle版本,我假设您使用的是最新版本(在旧版本中可能更简单)
OperatingSystem.current()
与“os.name”
环境变量一起工作,您可以使用Gradle命令上的-D标志非常简单地覆盖该环境变量
但是,这是一个大问题,但格拉德尔不是问题所在。用于执行构建的底层JRE包含特定于操作系统的代码-请参阅UNIX系统上的UNIXProcess。
UNIXProcess的当前实现在对其执行验证时会阻止重写“os.name”
值。
您可以在org.gradle.internal.os
包中创建一个类,公开包privateOperatingSystem.resetCurrent()
方法,然后强制OperatingSystem.current()
重新计算,绕过任何realJRE检查,从而绕过这个问题
大概是这样的:
print OperatingSystem.current()
System.setProperty("os.name", <some other OS>)
OperatingSystemWrapper.resetCurrent()
print OperatingSystem.current()
可以通过“-p”标志添加条件依赖项(请参阅)
使用“-D”标志也可以执行类似的操作,但是您需要使用System.getProperty
我们可以更进一步,为每种风格构建自定义任务和配置(从编译/实现继承),而不是依赖-p标志,因此这是一种糟糕的做法。有没有合适的方法可以使用gradle进行“交叉”构建(在同一台计算机上组装不同的发行版)?我想使用虚拟机是最好的策略?交叉编译是一回事,愚弄你的构建工具以为它在不同的操作系统中是另一回事。以Golang为例,它支持通过GOOS和GOARCH变量进行本机交叉编译,无需愚弄任何人和任何人。这只是一个问题,你在尝试做什么,你在使用什么,这直接依赖于OperatingSystem.current()。Java本质上是跨平台的。除非您使用JNI使用某些特定调用,或者将其他依赖项硬编码到您的应用程序中-更多详细信息会有所帮助是的,我同意愚弄构建工具是不好的。让我们忘掉那件事吧。我使用LWJGL,一种驱动本机库的OpenGL绑定。因此,有一些特定的jar包含特定操作系统的本机lib。为另一个平台构建是“微不足道的”,我只需要问Gradle“对于这个构建,您应该使用windows jar;对于下一个构建,让我们使用linux jar”。现在,它仍然是我自己的手动操作,所以我的问题是,如何正确地、自动地进行操作。也许我应该打开一个新的线程?让我直截了当地说,因为你还没有提供很多信息。您在构建代码依赖项时会遇到类似的情况{compile“org.lwjgl:lwjgl:${lwjglVersion}“compile”org.lwjgl:lwjgl平台:${lwjglVersion}:本地windows“compile”org.lwjgl:lwjgl平台:${lwjglVersion}:本地linux“compile”org.lwjgl:lwjgl平台:${lwjglVersion}:本地osx}您想为正确的操作系统特定的jar包含正确的本机库,对吗?很抱歉,我缺少信息。是的,你完全明白。因为有多个本地版本(vulkan、OpenAL、Joml等等),所以我更喜欢为每个平台创建一个轻量级构建。
apply plugin: "java"
dependencies {
compile "org.lwjgl:lwjgl:3.2.0"
compile "org.lwjgl:lwjgl-platform:3.2.0:natives-windows"
compile "org.lwjgl:lwjgl-platform:3.2.0:natives-linux"
compile "org.lwjgl:lwjgl-platform:3.2.0:natives-osx"
}
apply plugin: "java"
dependencies {
compile "org.lwjgl:lwjgl:3.2.0"
if (buildos == "windows") {
compile "org.lwjgl:lwjgl-platform:3.2.0:natives-windows"
} else if (buildos == "linux") {
compile "org.lwjgl:lwjgl-platform:3.2.0:natives-linux"
} else if (buildos == "osx") {
compile "org.lwjgl:lwjgl-platform:3.2.0:natives-osx"
}
}
gradle build -Pbuildos=windows