Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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 在生产中设置与在开发中具有不同值的标志的一般做法是什么_Java_Flags - Fatal编程技术网

Java 在生产中设置与在开发中具有不同值的标志的一般做法是什么

Java 在生产中设置与在开发中具有不同值的标志的一般做法是什么,java,flags,Java,Flags,假设我有一个标志公共静态最终布尔标志。 在开发中,我希望它是true,但在生产中,我希望它是false 我是否应该在开发时直接将其设置为true,当我们构建/发布时,有人会将其更改为false 我有一种感觉,这不是一个好办法,因为它看起来很可怕 我应该采取什么方法?您可以将文件放置在仅在开发期间存在的位置。 在运行时,该标志被初始化为 flag = file.exists(); 据我所见,文件用于在运行时处理特定于环境和应用程序的属性 例如,假设您有两个属性文件—一个用于开发,一个用于生产。下

假设我有一个标志
公共静态最终布尔标志
。
在开发中,我希望它是
true
,但在生产中,我希望它是
false

我是否应该在开发时直接将其设置为
true
,当我们构建/发布时,有人会将其更改为
false

我有一种感觉,这不是一个好办法,因为它看起来很可怕


我应该采取什么方法?

您可以将文件放置在仅在开发期间存在的位置。 在运行时,该标志被初始化为

flag = file.exists();
据我所见,文件用于在运行时处理特定于环境和应用程序的属性

例如,假设您有两个属性文件—一个用于开发,一个用于生产。下面是它们的样子:

开发人员属性:

application.flag=true
application.flag=false
生产性质:

application.flag=true
application.flag=false
它们都是相同的文件名,因此您不必担心读取“不同”的文件

然后加载该文件,并读取该特定属性:

Properties properties = new Properties();
InputStream inputStream = null;

try {
    inputStream = new FileInputStream("/path/to/application/app.properties");
    properties.load(inputStream);
    System.out.println(properties.getProperty("application.flag"));

} catch (IOException e) {
    e.printStackTrace();
}

如果在该文件中设置了产品的值,则会得到
false
。如果你有开发的价值,你会得到
true

如果不是一个属性文件,那么对于系统属性来说,听起来是个不错的地方。 -Dflag=true

其中-D是用于启动JVM的行的一部分。在Tomcat its上,在bin/

下setenv.sh中的JAVA_OPTS环境变量中,如果它是“非危险”属性,则外部化到属性文件中-它们易于管理和部署:

myFlag=true
如果是更重要的属性,请在命令行上设置该属性。这使得设置标志成为一个有意识的操作决策,这意味着将文件从开发人员意外复制到生产环境不会造成损坏:

java -DmyFlag=true ...
如果非常重要,请使用环境变量,该变量可以通过
System.getEnv()
访问,并且不能被代码覆盖

export myFlag=true
java ...

如果prod和dev中运行的代码完全相同,那么a可能是更容易实现的选择。在dev中运行时,只需在使用
-D
开关调用JVM时标记属性

我们使用一个众所周知的外部配置文件(Java属性文件),该文件位于类路径上,包含特定的开发条目。 文件的
URL
可以使用上的
getResource(“wellKnownName”)
轻松恢复

如果您正在为prod和dev构建不同的版本,那么主jar清单中的条目或捆绑属性文件可能是更好的选择


下面是一个详细描述如何使用Maven执行此操作的示例。

嗯。。。好啊听起来有点笨拙,但我想它会起作用,虽然我希望它的价值会在编译时知道。BTW,你不认为发展和生产是互斥的吗?一旦进入生产阶段,就没有回头路了?在这种情况下,更改标志并重新编译并不是最糟糕的选择。我担心的是,一些人将不得不手动更改标志。(说真的,谁还在手工编译和发布他们的软件?!)可能的重复