JBoss类路径问题

时间:2013-07-02 18:36:35

标签: java java-ee jboss classpath jboss7.x

在/ class下的java代码中我有

str_url = "/jasperReports/report.jasper";
url = getClass().getResource(str_url);

实际的report.jasper模板位于

之下
Application.war\WEB-INF\classes\jasperReports

来自war文件,但现在应用程序给出了以下例外情况:

net.sf.jasperreports.engine.JRException: java.io.FileNotFoundException: 
C:\Windows\System32\content\Application.war\WEB-INF\classes\jasperReports\report.jasper

所以发生了什么以及为什么应用程序在System folder下查找模板,这根本不是临时文件夹或缓存文件夹。

更新

我在部署应用程序时遇到异常:

15:29:43,359 WARN  [org.jboss.as.ee] (MSC service thread 1-1) JBAS011006: Not installing optional component examples.ShowSource due to exception: java.lang.ClassNotFoundException: examples.ShowSource from [Module "deployment.Application.war:main" from Service Module Loader]
at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:190)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassUnchecked(ConcurrentClassLoader.java:468)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:456)
at org.jboss.modules.ConcurrentClassLoader.performLoadClassChecked(ConcurrentClassLoader.java:423)
at org.jboss.modules.ConcurrentClassLoader.performLoadClass(ConcurrentClassLoader.java:398)
at org.jboss.modules.ConcurrentClassLoader.loadClass(ConcurrentClassLoader.java:120)
at java.lang.Class.forName0(Native Method) [rt.jar:1.6.0_35]
at java.lang.Class.forName(Class.java:247) [rt.jar:1.6.0_35]
at org.jboss.as.server.deployment.reflect.DeploymentClassIndex.classIndex(DeploymentClassIndex.java:54)
at org.jboss.as.ee.component.deployers.EEModuleConfigurationProcessor.deploy(EEModuleConfigurationProcessor.java:81) [jboss-as-ee-7.1.2.Final-redhat-1.jar:7.1.2.Final-redhat-1]
at org.jboss.as.server.deployment.DeploymentUnitPhaseService.start(DeploymentUnitPhaseService.java:116)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811)
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_35]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_35]
at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_35]

1 个答案:

答案 0 :(得分:0)

@Dreamer不要认为jboss AS直接读取war文件中的类和其他东西。事实上,jboss在运行时使用 temp 并将war文件内容放入(或转换)为“.. \ standalone \ tmp \ vfs \ temp ..”

例如,如果您的war文件位于以下路径中:

D:\wildfly-9.0.1.Final\standalone\deployments\myApp.war

在运行时我们有类似的东西:

D:\wildfly-9.0.1.Final\standalone\tmp\vfs\temp\temp4b7f8b311765d81a\content-5bbc912a62a7929e

(任何运行后,上一条路径都会发生明显变化)。

现在假设我们有一个名为“Test.java”的类,我们希望通过这样的方式获得它的真实路径:

String projectUrl = Test.class.getProtectionDomain().getCodeSource().getLocation().toString();

projectUrl是:

   vfs:/D:/wildfly-9.0.1.Final/bin/content/myApp.war/WEB-INF/classes

我认为这条道路不是你想要的实用的东西!重要的是我们知道运行时war文件更改的真实路径:)。

我遇到了同样的问题。我有一个应用程序,我们使用JSF,我想加载一个jrxml文件。我解决了它:

String this.projectUrl = FacesContext.getCurrentInstance().getExternalContext().getRealPath("one file");//to get my current app path in temp!

myFilePath = this.projectUrl + File.separator + "WEB-INF" + File.separator + "classes" + File.separator + "reportResources" + File.separator + "test.jrxml";//and read it;

并加载我的文件:

 ClassLoader loader = TestClass.class.getClassLoader();
 InputStream reportStream = loader.getResourceAsStream(myFilePath);//and load it

我希望这可以帮到你;