我正在使用JavaFX,Gradle,javafx-gradle-plugin构建Java桌面应用程序。此应用程序连接到我也构建的服务器。当我编译发布版本,运行gradle jfxNative
时,我希望它与生产服务器通信;但除此之外,我希望它与localhost交谈。
正确的Java / Gradle处理方式是什么?某种编译资料?
答案 0 :(得分:6)
您可以使用Gradle' source sets:
示例build.gradle:
apply plugin: 'java'
sourceSets {
prod {
java {
srcDirs = ['src/main/java', 'src/prod/java']
}
}
dev {
java {
srcDirs = ['src/main/java', 'src/dev/java']
}
}
}
task devJar(type: Jar) {
from sourceSets.dev.output
manifest {
attributes("Main-Class": "MyPackage.MyClass")
}
}
task prodJar(type: Jar) {
from sourceSets.prod.output
manifest {
attributes("Main-Class": "MyPackage.MyClass")
}
}
现在,您可以为dev和prod版本创建两个配置类:
src/dev/java/MyPackage/Configuration.java
src/prod/java/MyPackage/Configuration.java
所有常用代码都在主要的源集中:
src/main/java/MyPackage/MyClass.java
MyClass可以从配置类中获取一些值(例如Configuration.getBaseUrl()
)
正在运行gradle devJar
/ gradle prodJar
构建其中一个变体。
注意:在您的情况下,您可能需要延长jfxNative
/ jfxJar
而不是Jar
。
答案 1 :(得分:4)
最简单的解决方案:拥有包含此类信息的配置文件。 您可以将其作为java资源编译到应用程序中,也可以将其放在jar文件旁边,以便通过文件系统轻松查找。
使用gradle,您需要做的就是定义两个具有不同输入属性的构建任务,并使用groovy模板将值插入属性文件中。
src / main / resources中的application.properties:
server.address=${serverAddress}
添加到build.gradle
task setProductionServerAddress {
processResources.expand([serverAddress: "https://app.example.com/v1"])
}
jfxJar.dependsOn(setProductionServerAddress)
jfxNative.dependsOn(setProductionServerAddress)
然后在申请表上:
Properties properties = new Properties();
properties.load(getClass().getResourceAsStream("/application.properties"));
if (properties.getProperty("server.address").equals("${serverAddress}")) {
setUrl("http://localhost:8080/v1");
} else {
setUrl(properties.getProperty("server.address"));
}
答案 2 :(得分:1)
让它检查配置文件名称的环境变量。与gradle或build无关。无论在何处部署,该程序都应该正常运行。
请参阅,例如Properties for dev and production
最简单的方法是定义一个系统属性,该属性指定数据的文件系统位置。生产应用程序服务器将定义一个值(在启动脚本中使用java -D),您的开发应用程序服务器将定义另一个值。您的应用程序源将查询系统属性值(使用System.getProperty())以发现适当的位置
此外,这是有道理的。
将您需要的信息放在JNDI中 - 这就是它的设计目标。 如果信息不存在,请考虑让您的申请拒绝做任何事情。
另一个参考:What is the best way to manage configuration data
编辑:嗯,你在问什么在逻辑上是不可能的,在我看来。 "它应该连接到生产,除非特定的人想要连接到开发,但该功能只应提供给不知名的人"开始菜单只是运行应用程序的快捷方式,因此您可以安装" dev"命令行设置的快捷方式,读作环境变量。
答案 3 :(得分:0)
我会选择其中一个“12 factor app”概念,可以阅读here
其主要概念之一是使用系统环境变量,该变量应确定您是在使用prod还是dev或qa env等。 每个项目/环境/机器应该包含其相关的env属性,之后可以通过类似于maven profile插件的gradle过程检索。
如何检测的示例:
`if (project.hasProperty('env') && project.getProperty('env') == 'prod') {
apply from: 'gradle/production.gradle'
} else {
apply from: 'gradle/development.gradle'
}`
更多关于使用gradle的方法可以找到:gradle profile
答案 4 :(得分:0)
您需要选择一个配置方案(如果JavaFX没有为您挑选一个)。
我喜欢https://github.com/typesafehub/config。
配置库将提供有关如何制作"制作"的说明。配置不同于您的"开发"配置。
另见JavaFX:Editable Configuration Files After Packaging
正确的Java / Gradle处理方式是什么?某种编译资料?
不,我强烈建议不要为生产版本编译不同的代码。测试。它会使您的测试无效。这应该在配置中处理,而不是在代码中处理。传统的Java方法是使用配置文件(可以将其作为资源编译到JAR中)。
我有点看,我很惊讶没有找到一个高质量的教程,我可以把你链接到这里,对不起(我发现了一些垃圾)。也许这个问题将成为其他人的参考。
我会做这样的事情:
我猜这里为什么没有很多教程可供所有应用程序或网络框架为您处理。
答案 5 :(得分:0)
在我看来,和其他人一样,这与构建有很大关系,与运行时间有关。
因此,你可以求助于检查某种运行时标志 - 一种方便且常用的方法是使用系统属性。
在你的开发框中,你可以设置一个环境变量 - 比如说FX _DESKTOP_APP_ENV = DEV或其他一些。
您可以在代码中查看并确定要使用的网址。
String env = System.getenv("FX _DESKTOP_APP_ENV");
String url = env == null ? "Production" : env;
在Windows系统上,您可以设置系统环境变量,如{ - 3}}
在* nix系统enter link description here
上希望这有帮助