我有两个班级
public class CsvReaderExample {
public static void main(String[] args) {
try {
String file=CsvReaderExample.class.getResource("/saralbitta/common/db/DateNepali.csv").getFile();
下一课是
public class LoanIssueView extends ViewPart {
public LoanIssueView() {
}
@Override
public void createPartControl(Composite parent) {
String file=LoanIssueView.class.getResource("/saralbitta/common/db/DateNepali.csv").getFile();
当我在两个班级中打印file
时,我感到很惊讶,在一个班级中,我在第一个案例中得到如下所示的outPut
/E:/myskbbl/saralbitta/bin/saralbitta/common/db/DateNepali.csv
同样在第二种情况下,我将outPut as
/saralbitta/common/db/DateNepali.csv
为什么具有相同代码的两个类给出不同的输出。我在第二种情况下得到fileNotFoundException,因为我需要像第一种情况一样的输出。如何在第二个案例中获得类似输出的输出?
答案 0 :(得分:0)
CsvReaderExample和LoanIssueView类是否包含在不同的bundle / plugins中?每个包都有自己的类路径,除非您允许,否则无法查看其他包的类。 Interbundle依赖项在Manifest中声明。
编辑:好的,那很清楚。在第一种情况下,OSGi没有启动,所以它是一个普通的Java应用程序。在第二种情况下,OSGi启动,每个包都有自己的类加载器。我会尝试从捆绑包中请求资源。在那里使用getResource()方法http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/Bundle.html#getResource%28java.lang.String%29。您可以从 BundleContext 获取捆绑引用。您从 BundleActivator start()方法http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleActivator.html#start%28org.osgi.framework.BundleContext%29获得 BundleContext 。请注意,您获取的URL不是文件URL。使用 FileLocator 将网址转换为文件网址http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fcore%2Fruntime%2FFileLocator.html。
答案 1 :(得分:0)
这些程序从哪里执行?查找资源时,有一种算法,通过该算法确定绝对名称。它还取决于类加载器。可能这就是为什么你会看到不同的结果。
答案 2 :(得分:0)
它应该与类路径设置的差异有关。检查两个应用程序的类路径设置。
答案 3 :(得分:0)
在第一种情况下,getResource()
将返回文件字符串。但在第二种情况下,getResource()
无法找到路径并尝试调用findResource()
方法,如文档中所述:
此方法将首先在父类加载器中搜索资源; 如果父级为null,则类加载器的路径内置于 搜索虚拟机。失败了,这个方法会调用 findResource(String)来查找资源。
这可能是不同返回字符串的原因,因为根据流程可能会调用不同的方法。