如何从我的java程序外部更改user.home系统属性,以便它认为它与D:\ Documents and Settings \%USERNAME%不同?通过环境变量或VM参数?
我受到另一个问题的启发:使用Java系统属性的最佳实践
我目前正在寻找Java系统属性和可能值的完整列表.我正在研究一个简单的类来简化它们的使用(如果你有兴趣,请获取源和背景信息(我的博客)).在这个课程中,我尝试提供以下内容:
要获得完整的文档和可用属性的完整列表(即使可用性严重依赖于JVM的那些),我希望您下载源代码,运行它并发布结果.我会相应地更新课程,并在指定地点保持可用.希望它会让你们中的一些人放松一下:)
编辑:
我不是在寻找System.getProperties()所描述的标准属性,也不是我系统上可用的所有属性.我正在尝试创建一个完整的系统属性列表 - 甚至是那些与供应商,jvm或版本相关的属性 - 那些不保证存在且文档稀疏或难以找到的属性.属性如
我希望让其他人运行我的代码并发布他们的结果,以便以易于使用的Java枚举的形式编译一个全面的列表(包含属性及其可能值的大量文档),例如:
String file = SystemProperty.JAVA_IO_TMPDIR + "file.txt";
Run Code Online (Sandbox Code Playgroud)
代替
String tmp = System.getProperty("java.io.tmpdir");
if (!tmp.endsWith(File.separator)
tmp += File.separator;
new File(tmp).mkdirs(); // make sure tmp exists
String file = tmp + "file.txt";
Run Code Online (Sandbox Code Playgroud)
所以请运行该代码并发布您的发现.这是一个简单的脚本,可以帮助您入门:
#!/bin/bash
# download and run
# you should really look at the code first, as you can't …
Run Code Online (Sandbox Code Playgroud) 我们的Web应用程序使用SystemPropertyPlaceholder根据系统属性的值加载属性文件(参见下文)
在本地运行它的默认设置存储在application.properties
.在生产服务器上,我们目前只是在部署应用程序之前将"env"设置为"production",它将加载production.properties
.
现在,为了测试应用程序,test.properties
应该使用一个文件.
如果我在我们的jenkins构建中运行所有测试,则添加-Denv=test
将按预期工作.但是,如果我只想在Eclipse中使用集成的JUnit运行器运行单个测试呢?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = {"classpath:application-context.xml" })
public class SomeTest {
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉我的测试它应该在Spring加载之前将系统属性"env"设置为"test"?因为using MethodInvokingFactoryBean
只会出于某种原因设置它,即使我在加载属性文件之前设置它:
<bean id="systemPrereqs"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" value="#{@systemProperties}" />
<property name="targetMethod" value="putAll" />
<property name="arguments">
<!-- The new Properties -->
<util:properties>
<prop key="env">test</prop>
</util:properties>
</property>
</bean>
<bean
class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
<property name="searchContextAttributes" value="true" />
<property name="contextOverride" value="true" />
<property name="ignoreResourceNotFound" value="true" />
<property name="locations">
<list>
<value>classpath:application.properties</value>
<value>classpath:${env}.properties</value>
<value>${config}</value>
</list>
</property>
</bean>
<bean id="managerDataSource" …
Run Code Online (Sandbox Code Playgroud) 如果我在调用JVM时多次指定系统属性,当我检索属性时,我将实际得到哪个值?例如
java -Dprop=A -Dprop=B -jar my.jar
Run Code Online (Sandbox Code Playgroud)
我打电话的结果是什么System.getProperty("prop");
?
关于这个的Java文档并没有真正告诉我这方面有用的东西.
在我对运行不同JVM的几台机器进行的非科学测试中,似乎最后一个值是返回的值(这实际上是我需要的行为)但是我想知道这种行为是否在任何地方正式定义,或者它是否可以在JVM之间变化?
我在Jetty上运行webapp.应用程序的配置来自运行Jetty的同一服务器上的文件.在应用程序内部,我依靠系统属性来获取文件的路径,以便我可以解析它.例如
final String loc = System.getProperty(FACTORY);
Run Code Online (Sandbox Code Playgroud)
现在我可以使用D开关启动jetty以$FACTORY
在命令行上提供但是如果可以的话我宁愿把它放在jetty.xml中.我知道有<SystemProperty />
标签,但似乎只提供<Set/>
标签已存在的系统值.有人可以举例说明如何实现这一目标吗?(如果可以实现)
如果您将系统代理设置为HTTP,则HTTP
仅当从main
java应用程序的方法运行时,才会打印以下内容.
但是,如果从JUnit 4测试(在eclipse中)调用它,它总是打印DIRECT
.
还注意到-Djava.net.useSystemProxies=true
在eclipse 中定义:运行配置 - >参数 - > VM参数.测试只是挂起.
知道发生了什么事吗?
非常感谢,
public void printSystemProxy() {
System.setProperty("java.net.useSystemProxies", "true");
try {
final List<Proxy> list = ProxySelector.getDefault().select(new URI("http://foo/bar"));
for (final Proxy proxy : list) {
System.out.println(proxy.type());
}
}
catch (final URISyntaxException e) {
throw new IllegalStateException(e);
}
}
Run Code Online (Sandbox Code Playgroud) 在我的单元测试中,我需要将"workingDir"系统属性设置为Null.
但我不能这样做,因为它给了我NullPointerException:
System.setProperty("workingDir", null);
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
我有一个List<String>
文件夹中的文件名和一个特定的文件名String
.我想检测文件名是否在列表中,但是需要尊重底层文件系统是否区分大小写的属性.
有没有简单的方法来做到这一点(除了检查的"黑客" System.getProperty("os.name", "").toLowerCase().indexOf("windows")!=-1
)?;-)
我有一个蚂蚁脚本,它有一个taskdef
和任务创建一个https互联网连接,并且有一些SSL的东西是错误的.因此,我想设置系统属性javax.net.debug=all
以获取更多信息.
在java中我会使用该-D
选项执行此操作,但在ant中,这用于与系统属性不同的ant属性.
如果这不是一个taskdef
而是一个java
任务,我可以使用该sysproperty
属性,但它不是 - java
任务.
谷歌搜索这是令人沮丧的复杂,因为蚂蚁的蚂蚁属性和系统属性非常相似,大多数搜索结果都是关于另一个(或关于java
-task).
我敢肯定,我的思念很简单的东西......我想设置系统属性java.awt.headless
来true
为我的SBT项目.阅读关于属性的页面我认为我需要使用system
或systemOptional
.在我的项目文件中,我尝试过以下内容:
lazy val javaAwtHeadless = system[Boolean]("java.awt.headless")
Run Code Online (Sandbox Code Playgroud)
将其设置为用户属性(例如lazy val javaAwtHeadless = property[Boolean]
)并设置附带的值build.properties
使得属性在sbt控制台中可见,但不在sbt的Scala控制台(via System.getProperty("java.awt.headless")
)中.
set java.awt.headless true
从sbt控制台工作,包括在Scala控制台中设置,但它不会持续到下次我启动sbt.