在/ 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]
答案 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
我希望这可以帮到你;