繁体   English   中英

在JAR中加载属性文件?

[英]Load properties file in JAR?

当我的网络应用程序所依赖的其中一个罐试图从jar中加载属性文件时,我遇到了麻烦。 这是jar中的代码。

static
{
    Properties props = new Properties();
    try 
    {
        props.load(ClassLoader.getSystemResourceAsStream("someProps.properties"));
    } catch (IOException e) 
    {
        e.printStackTrace();
    }
    someProperty = props.getProperty("someKey");
}

属性文件位于Maven项目的“src / main / resources”目录中。 当我在Eclipse中的junit测试中运行此代码时,它执行得很好。 当项目使用Maven构建到jar中,并作为依赖项包含在我的Web应用程序中时,它无法找到属性文件。 我知道属性文件位于依赖于jar的基本目录中,我不知道如何解决这个问题。

问题是您正在使用getSystemResourceAsStream 使用getResourceAsStream 系统资源从系统类加载器加载,几乎可以肯定不是在作为webapp运行时加载jar的类加载器。

它在Eclipse中工作,因为在启动应用程序时,系统类加载器配置为您的jar作为其类路径的一部分。 (例如,java -jar my.jar将在系统类加载器中加载my.jar。)Web应用程序不是这种情况 - 应用程序服务器使用复杂的类加载将Web应用程序彼此隔离,并与应用程序服务器的内部隔离。 例如,请参阅tomcat类加载器的方法 ,以及使用的类加载器层次结构的图表。

编辑:通常,您可以调用getClass().getResourceAsStream()来检索类路径中的资源,但是当您在静态初始化程序中获取资源时,您需要显式命名您想要的类加载器中的类。从...加载。 最简单的方法是使用包含静态初始化程序的类,例如

[public] class MyClass {
  static
  {
    ...
    props.load(MyClass.class.getResourceAsStream("/someProps.properties"));
  }
}

有关记录,请参阅如何向JAR添加资源? (图示为单元测试,但同样适用于“常规”资源):

要为单元测试的类路径添加资源,您将遵循与向JAR添加资源相同的模式,除了您放置资源的目录是${basedir}/src/test/resources 此时,您将拥有一个项目目录结构,如下所示:

 my-app |-- pom.xml `-- src |-- main | |-- java | | `-- com | | `-- mycompany | | `-- app | | `-- App.java | `-- resources | `-- META-INF | |-- application.properties `-- test |-- java | `-- com | `-- mycompany | `-- app | `-- AppTest.java `-- resources `-- test.properties 

在单元测试中,您可以使用以下代码的简单代码段来访问测试所需的资源:

 ... // Retrieve resource InputStream is = getClass().getResourceAsStream("/test.properties" ); // Do something with the resource ... 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM