4

如何使用 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
4

3 回答 3

2

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

您的路径WebContent/includes/images/似乎在 WAR 文件的根目录中(不是类路径)。这样你就可以

  • 使用getResourceAsStreamServletContext参见此处)处理 WAR 文件根目录的路径。
  • 将所有图像打包在一个额外的 JAR(例如my-app.resources.jar)中并使用ClassLoader.getResourceAsStream()
  • 在类路径中移动图像(见上文)。
于 2012-06-01T10:33:32.883 回答
1

如JBoss 社区 wiki 中所述(不使用文件jboss-deployment-structure.xml):

  1. 为配置文件 ( jboss-as-7/modules/com/yourcompany/configuration/main/module.xml) 创建一个模块:
<?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. 向模块添加属性:
jboss-as-7/
   modules/
      com/
         yourcompany/
            configuration/
               main/
                 module.xml
                 settings.properties
                 other-settings.xm
  1. 将模块添加到CLASSPATHusingMANIFEST.MF条目:
Manifest-Version: 1.0
Dependencies: com.mycompany.configuration
  1. 从 CLASSPATH 加载属性文件:
InputStream settingsStream = 
  getClass().getClassLoader().getResourceAsStream("settings.properties");

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

URL imgUrl = this.getClass().getClassLoader().getResource("myimage.jpg");
于 2012-11-02T12:01:06.790 回答
0

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

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

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

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

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

    然后可以使用以下代码加载此 jar 中的任何属性文件,

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

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

    InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("xyz.properties");

于 2013-07-26T04:47:44.890 回答