在 Java 应用程序中拥有用于开发和发布的各种 URL 端点的正确方法是什么?

2022-09-04 03:40:35

我正在构建一个Java桌面应用程序,使用JavaFX,Gradle,javafx-gradle-plugin。此应用程序连接到我也构建的服务器。当我编译一个发布版本,运行时,我希望它与生产服务器通信;但除此之外,我希望它与本地主机交谈。gradle jfxNative

Java/Gradle 处理这个问题的正确方法是什么?某种编译配置文件?


答案 1

您可以使用 Gradle 的源代码集来实现以下目的:

Sample 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")
    }
}

现在,您可以为开发和生产版本创建两个配置类:src/dev/java/MyPackage/Configuration.java
src/prod/java/MyPackage/Configuration.java

所有通用代码都将在主源代码集中:
src/main/java/MyPackage/MyClass.java

MyClass可以从配置类中获取一些值(例如Configuration.getBaseUrl())

运行 /构建其中一个变体。gradle devJargradle prodJar

注意:您可能需要扩展/而不是在您的情况下。jfxNativejfxJarJar


答案 2

最简单的解决方案:拥有一个包含此类信息的配置文件。您可以将其作为java资源编译到应用程序中,也可以将其放在jar文件旁边,以便可以通过文件系统轻松查找它。

使用 gradle,您需要做的就是定义两个具有不同输入属性的构建任务,并使用时髦的模板将值插入到属性文件中。

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"));
}

推荐