1

我有两个班

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时,我感到非常惊讶,以至于在一个课程中,我在第一种情况下得到如下输出

 /E:/myskbbl/saralbitta/bin/saralbitta/common/db/DateNepali.csv 

同样,在第二种情况下,我将 outPut 作为

/saralbitta/common/db/DateNepali.csv

为什么具有相同代码的两个类给出不同的输出。我在第二种情况下得到 fileNotFoundException,因为我需要第一种情况下的输出。如何在第二种情况下获得类似第一种情况的输出?

4

4 回答 4

0

应该和classpath设置的不同有关。检查两个应用程序的类路径设置。

于 2012-09-11T11:07:02.357 回答
0

CsvReaderExample 和 LoanIssueView 类是否包含在不同的包/插件中?每个包都有自己的类路径,除非您允许,否则无法看到其他包的类。包间依赖关系在 Manifest 中声明。

编辑:好的,那就很清楚了。在第一种情况下,OSGi 没有启动,所以它是一个普通的 Java 应用程序。在第二种情况下,OSGi 启动并且每个包都有自己的类加载器。我会尝试从捆绑包中请求资源。在http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/Bundle.html#getResource%28java.lang.String%29使用 getResource() 方法。您可以从BundleContext获取包引用。您可以从BundleActivator start() 方法http://www.osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleActivator.html#start%28org.osgi.framework.BundleContext%29获得BundleContext。请注意,您获取的 URL 不是文件 URL。使用文件定位器将 URL 转换为文件 URL http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fcore%2Fruntime%2FFileLocator .html

于 2012-09-11T10:48:55.383 回答
0

这些程序是从哪里执行的?查找资源时,有一种算法可以确定绝对名称。它还取决于类加载器。可能这就是您看到不同结果的原因。

于 2012-09-11T10:51:12.060 回答
0

检查两者的文档getResourcefindResource

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

getResource

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

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

于 2012-09-11T12:11:27.337 回答