在java中定位资源时,两个类在相同代码上提供不同的输出

时间:2012-09-11 10:37:48

标签: java resources eclipse-rcp

我有两个班级

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,因为我需要像第一种情况一样的输出。如何在第二个案例中获得类似输出的输出?

4 个答案:

答案 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)

查看getResourcefindResource

的文档

在第一种情况下,getResource()将返回文件字符串。但在第二种情况下,getResource()无法找到路径并尝试调用findResource()方法,如文档中所述:

getResource

  

此方法将首先在父类加载器中搜索资源;   如果父级为null,则类加载器的路径内置于   搜索虚拟机。失败了,这个方法会调用   findResource(String)来查找资源。

这可能是不同返回字符串的原因,因为根据流程可能会调用不同的方法。