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

在java中定位资源时,两个类在同一代码上给出不同的输出,java,resources,eclipse-rcp,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

我有两门课

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();
当我在这两个类中打印文件时,我非常惊讶,在一个类中,我得到的输出如下第一种情况

 /E:/myskbbl/saralbitta/bin/saralbitta/common/db/DateNepali.csv 
类似地,在第二种情况下,我得到的输出为

/saralbitta/common/db/DateNepali.csv

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

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


编辑:好的,那就清楚了。在第一种情况下,OSGi没有启动,因此它是一个普通的Java应用程序。在第二种情况下,启动OSGi,每个包都有自己的类加载器。我会尝试从包中请求资源。在那里使用getResource方法。您可以从BundleContext获取捆绑包引用。您可以从BundleActivator开始方法获取BundleContext。请注意,您获取的URL不是文件URL。使用FileLocator将URL转换为文件URL

这些程序从哪里执行?在查找资源时,有一种算法可用于确定绝对名称。它还取决于类装入器。这可能就是为什么会看到不同的结果。

这应该与类路径设置的差异有关。检查两个应用程序的类路径设置。

检查和的文档

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

:

此方法将首先在父类装入器中搜索资源; 如果父级为null,则类装入器内置到 搜索虚拟机。如果失败,此方法将调用 findResourceString以查找资源


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

您有权访问第二个类吗?@RomanC两者都是独立的类。它们之间没有链接。为什么代码试图为应用程序资源建立文件?如果它是嵌入式资源,则需要通过URL访问。@AndrewThompson我已将csv文件放入项目中,并且我需要知道其在驱动器中的URL。应用程序是否执行此操作。尝试写入CSV,还是只读?它们在同一个包中,在同一个项目中?在第一种情况下,我只运行一个类作为静态void main。我在应用程序中运行的下一个案例就是为什么我会得到不同的结果。那么,在第二种情况下,有没有办法获取url。可能是您正在编写。在第一种情况下,我只运行一个类,以防静态void main,但下一种情况是我运行整个应用程序。