使用Jboss7,Load Resource返回null

时间:2012-05-31 11:51:27

标签: java java-ee jboss jboss7.x

如何使用Jboss7.1从Java代码中加载像图像这样的资源?

这曾经用于Jboss4:

this.getClass().getClassLoader().getResourceAsStream("/myapp/includes/images/image1.png");

现在返回null。

现在使用Jboss7在Java代码中加载资源的最佳做法是什么?

我做了一些测试:

URL url = this.getClass().getResource("");
System.out.println(url);
url = this.getClass().getResource("../../../");
System.out.println(url);
url = this.getClass().getResource("../../../../");
System.out.println(url);
url = this.getClass().getResource("../../../../../");
System.out.println(url);
url = this.getClass().getResource("includes");
System.out.println(url);

13:33:49,143 INFO  [stdout] (http--127.0.0.1-8080-1) vfs:/C:/Eclipse/apps/jboss-as-7.1.1.Final/standalone/deployments/my-ea.ear/my-web.war/WEB-INF/classes/com/xxx/yyy/beans/jsf/
13:33:49,144 INFO  [stdout] (http--127.0.0.1-8080-1) vfs:/C:/Eclipse/apps/jboss-as-7.1.1.Final/standalone/deployments/my-ea.ear/my-web.war/WEB-INF/classes/com/xxx/
13:33:49,150 INFO  [stdout] (http--127.0.0.1-8080-1) jar:file:/C:/Eclipse/apps/jboss-as-7.1.1.Final/modules/javax/activation/api/main/activation-1.1.1.jar!/com/
13:33:49,151 INFO  [stdout] (http--127.0.0.1-8080-1) file:/C:/Eclipse/apps/jboss-as-7.1.1.Final/modules/sun/jdk/main/service-loader-resources/
13:33:49,152 INFO  [stdout] (http--127.0.0.1-8080-1) null

3 个答案:

答案 0 :(得分:2)

方法this.getClass().getClassLoader().getResourceAsStream("path")正在从类路径的根处理路径。在WAR中,这通常是WEB-INF/classesWEB-INF/lib

您的路径WebContent/includes/images/似乎位于WAR文件的根目录中(不是类路径)。所以你可以

  • 使用getResourceAsStream的{​​{1}}(请参阅here)来处理WAR文件根目录的路径。
  • 将您的所有图片打包到其他JAR中(例如ServletContext)并使用my-app.resources.jar
  • 在类路径中移动图像(见上文)。

答案 1 :(得分:1)

作为JBoss社区wiki上的documented(不使用jboss-deployment-structure.xml文件):

  1. 为配置文件(jboss-as-7/modules/com/yourcompany/configuration/main/module.xml)创建模块:
  2. <?xml version="1.0" encoding="UTF-8"?>
    <module xmlns="urn:jboss:module:1.1" name="com.mycompany.configuration">
        <resources>
            <resource-root path="."/>
        </resources>
    </module>
    
    1. 向模块添加属性:
    2. jboss-as-7/
         modules/
            com/
               yourcompany/
                  configuration/
                     main/
                       module.xml
                       settings.properties
                       other-settings.xm
      
      1. 使用CLASSPATH条目
      2. 将模块添加到MANIFEST.MF
        Manifest-Version: 1.0
        Dependencies: com.mycompany.configuration
        
        1. 从CLASSPATH加载属性文件:
        2. InputStream settingsStream = 
            getClass().getClassLoader().getResourceAsStream("settings.properties");
          

          我必须创建一个名为com/mycompany/main的模块文件夹,并在其中添加所有图像。因此,至少在JBOSS_HOME内,它位于WAR之外。然后我可以使用以下方式加载图像:

          URL imgUrl = this.getClass().getClassLoader().getResource("myimage.jpg");
          

答案 2 :(得分:0)

JBOSS 7中的类加载基于JBOSS模块项目。所有早期版本的加载都是分层的。

在早期版本的JBOSS中,我们可以通过修改run.sh/run.bat来放置/指定包含classpath属性中所有app属性的外部文件夹。

但是在JBOSS 7中加载基于JBOSS模块项目,外部属性配置不同。

您可以尝试以下两种方式在JBOSS 7中配置/加载属性文件,

  1. 准备包含应用程序所需的所有属性文件的jar。使用 这个罐子在你的战争/耳中。

    然后可以使用下面的代码

    加载此jar中的任何属性文件

    InputStream inputStream = Thread.currentThread()。getContextClassLoader()。getResourceAsStream(fileName);

  2. 社区链接https://community.jboss.org/wiki/HowToPutAnExternalFileInTheClasspath中提供了JBOSS 7中指定外部属性文件所需的更改。如果根据此链接完成更改,则部署将起作用。确保在JBOSS 7中进行配置后,必须使用以下代码来加载属性

    InputStream inputStream = this.getClass()。getClassLoader()。getResourceAsStream(“xyz.properties”);