如何使用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
答案 0 :(得分:2)
方法this.getClass().getClassLoader().getResourceAsStream("path")
正在从类路径的根处理路径。在WAR中,这通常是WEB-INF/classes
和WEB-INF/lib
。
您的路径WebContent/includes/images/
似乎位于WAR文件的根目录中(不是类路径)。所以你可以
getResourceAsStream
的{{1}}(请参阅here)来处理WAR文件根目录的路径。ServletContext
)并使用my-app.resources.jar
答案 1 :(得分:1)
作为JBoss社区wiki上的documented(不使用jboss-deployment-structure.xml
文件):
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>
jboss-as-7/
modules/
com/
yourcompany/
configuration/
main/
module.xml
settings.properties
other-settings.xm
CLASSPATH
条目MANIFEST.MF
醇>
Manifest-Version: 1.0
Dependencies: com.mycompany.configuration
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中配置/加载属性文件,
准备包含应用程序所需的所有属性文件的jar。使用 这个罐子在你的战争/耳中。
然后可以使用下面的代码
加载此jar中的任何属性文件InputStream inputStream = Thread.currentThread()。getContextClassLoader()。getResourceAsStream(fileName);
社区链接https://community.jboss.org/wiki/HowToPutAnExternalFileInTheClasspath中提供了JBOSS 7中指定外部属性文件所需的更改。如果根据此链接完成更改,则部署将起作用。确保在JBOSS 7中进行配置后,必须使用以下代码来加载属性
InputStream inputStream = this.getClass()。getClassLoader()。getResourceAsStream(“xyz.properties”);