Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Gradle:强制另一个操作系统_Java_Gradle_Build - Fatal编程技术网

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
包中创建一个类,公开包private
OperatingSystem.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