Java WAS Liberty profile-使用ClassLoader.getSystemResourceAsStream读取属性

Java WAS Liberty profile-使用ClassLoader.getSystemResourceAsStream读取属性,java,classpath,websphere-liberty,open-liberty,Java,Classpath,Websphere Liberty,Open Liberty,我们正在将应用程序从WAS 6.1迁移到Liberty。我们的应用程序使用第三方JAR,通过InputStream is=ClassLoader.getSystemResource(“myproperty.properties”)读取属性文件。 在WAS6.1中,我们将服务器类路径设置为myproperty.properties的位置。我们尝试了下面的方法来在Liberty中设置类路径,但没有任何效果 方法1:在jvm.options(D:\ConfigFiles\DEV \-包含myprope

我们正在将应用程序从WAS 6.1迁移到Liberty。我们的应用程序使用第三方JAR,通过
InputStream is=ClassLoader.getSystemResource(“myproperty.properties”)
读取属性文件。 在WAS6.1中,我们将服务器类路径设置为myproperty.properties的位置。我们尝试了下面的方法来在Liberty中设置类路径,但没有任何效果

方法1:在jvm.options(D:\ConfigFiles\DEV \-包含myproperty.properties的路径)中设置以下选项

方法2:在server.xml中设置类加载器

<library id="config">
 <folder dir="${server.config.dir}/config/" includes="*.properties" scanInterval="5s"/>
</library>

<enterpriseApplication id="applicationEAR" location="application.ear" name="application">
 <classloader privateLibraryRef="config"/>
</enterpriseApplication>


请告诉我们是否有其他方法可以覆盖/设置Liberty profile中的类路径?

如果您的最终目标是加载属性文件,则更简单的方法是使用bootstrap/env/system属性或server.xml中的
存储属性文件的位置,然后加载它。例如,使用环境变量:

(在server.xml文件中)

或者,如果您总是将配置属性文件放在
${server.config.dir}
下的某个位置,则可以使用Liberty中的内置
server\u config\u dir
环境变量:

String configDir = System.getenv("SERVER_CONFIG_DIR"); // equivalent to ${server.config.dir} in server.xml
InputStream is = new FileInputStream(configDir + "/myproperty.properties");

在管理配置的主题上,查看微文件配置(例如,
微文件-1.2
),您可能会发现它很有用:

尝试在jvm.options中设置此属性(而不是
-Djava.class.path=path/to/propertyDir
):

-Xbootclasspath/a:path/to/propertyDir

这将把属性目录(包含资源文件)的路径附加到JVM的引导类路径。因为这是一个附加,所以它也应该在Java9+中工作(Java9中删除了一些相关选项)

我怀疑
-Djava.class.path=…
不起作用的原因是JVM从WLP服务器脚本获取类路径,因此系统属性在服务器JVM启动时应用得太晚

您还可以将属性文件放在JVM的
lib/ext
目录中,但我还没有测试过。
-Xbootclasspath/a:path
方法在Mac上对我有效-我想它也适用于Windows


嗨,安迪

你好,安迪·吉伯特,谢谢你的回复。我们无法实现上述方法,因为代码片段
InputStream=ClassLoader.getSystemResource(“myproperty.properties”)
位于第三方jar中。那么,有没有一种方法可以在不更改读取逻辑的情况下重写类路径。请修复第三方库以使用如下方法:
getResourceAsStream()
InputStream is=this.getClass().getClassLoader().getResourceAsStream(“myproperty.properties”)不幸的是,我们无法访问第三方源代码。这解决了我的问题。现在读取属性文件。非常感谢你不客气-很高兴听到它对你有用。我对@Andy Guibert的答案投了赞成票,因为这可能是更好的长期解决方案,但这个答案适用于您无法控制加载资源/类/等的库的情况。嗨,Andy,我只是想检查一下这是否也适用于Linux?@Bruno是的。它应该可以在所有平台上运行,但我只在Mac上用OracleJava8JDK对它进行了测试。
<server>
  <featureManager>
    <feature>jndi-1.0</feature>
    ...
  </featureManager>

  <jndiEntry jndiName="configDir" value="D:\\ConfigFiles\\Dev"/>    
</server>
@Resource(lookup = "configDir")
String configDir;

InputStream is = new FileInputStream(configDir + "/myproperty.properties");
String configDir = System.getenv("SERVER_CONFIG_DIR"); // equivalent to ${server.config.dir} in server.xml
InputStream is = new FileInputStream(configDir + "/myproperty.properties");