我在Java编程工作了几周,并试图从类路径之外的文件夹中获取pentao报告定义,但到目前为止还没有成功。
以下成功从类路径中包含的文件夹加载定义,但是我无法弄清楚如何从类路径之外的绝对路径获取它:
// Parse the report file
final URL reportDefinitionURL = classloader.getResource("some/path/inclass/Sample1.prpt");
final ResourceManager resourceManager = new ResourceManager();
final Resource directly = resourceManager.createDirectly(reportDefinitionURL, MasterReport.class);
return (MasterReport) directly.getResource();
我不确定这是特定于pentaho还是普通的Java问题,但是如何根据绝对路径(linux)获取文件定义,该路径不在类路径中,例如
"/usr/share/pentaho/Sample1.prpt" ?
我试过这个:
File file = new File("/usr/share/pentaho/");
URL url = file.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
final URL reportDefinitionURL = cl.getResource("Sample1.prpt");
我也尝试在运行时包含外部路径,但这似乎不起作用:
java -cp ./lib/*:/usr/share/pentaho/*.prpt ...
非常感谢任何帮助!
答案 0 :(得分:0)
默认系统类加载器将仅在类路径中查找资源。如果你知道绝对路径,那么直接创建URL对象会更容易:
URL reportDefinitionURL = new URL("file:/tmp/Sample1.prpt");
我不熟悉pentaho api,所以不确定以下api是如何工作的。
resourceMgr.createDirectly(reportDefinitionURL, MasterReport.class);
在最后一行它返回一个“MasterReport”的实例,因此“MasterReport.class”应该在你的类路径中。
修改强>
我刚看了这个pentaho wiki - http://wiki.pentaho.com/display/Reporting/Using+the+DocumentBundle+Reader+and+Writer
看起来createDirectly()apis可以采用文件对象
File reportDefinitionFile = new File ("/tmp/Sample1.prpt");
resManager.createDirectly(reportDefinitionFile, MyClass.class);