在/ 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]

最佳答案

@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


我认为这条路不是您想要的实用的东西!重要的是,我们要知道战争文件在运行时的真实路径会发生变化:)。

我有同样的问题。我有一个使用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


希望对您有所帮助;

关于java - JBoss类路径问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17433254/

10-16 18:39
查看更多