2013-07-21 39 views
1

有一个Maven项目A.一旦我做了mvn干净安装,项目生成并且该jar可用于我的本地存储库,即 c:\ repository \ com \ stackoverflow \ A \ a.jar文件无法从绝对路径加载xml文件

a.jar文件包含了几个使用这些类

从另一个Maven项目我援引的,其中使用一个XML文件中的类的方法之一类和XML文件。

代码是:

public File xmlFilder(String xmlAbsolutePath) { 
    File f = new File(xmlAbsolutePath); 
    return f; 
} 

第二个项目位于我d驱动器。在获取绝对路径时,我得到的是正确的绝对路径\ com \ stackoverflow \ A \ res \ p.xml

但如果我在第3行中添加以下代码,我得到如下:

public File xmlFilder(String xmlAbsolutePath) { 

    File f = new File(xmlAbsolutePath); 

    System.out.println("AbsolutePath----"+f.getAbsolutePath()); ---> D:\com\stackoverflow\A\res\p.xml 

    System.out.println("getPath------------"+f.getPath());  ---> \com\stackoverflow\A\res\p.xml 

    System.out.println("exists--------------"+f.exists());  ----> false 

return f; 

} 

任何人都可以请让我知道我错了。为什么它不从C盘中的存储库中选择xml。

+0

目前尚不清楚你的xml文件在哪里。你想从jar或从文件系统加载它吗?在A.jar的资源文件夹中存在xml文件 –

+0

。该jar存在于C驱动器中的存储库中。请注意,我已经正确添加了依赖项,并且能够正确访问项目B中A.jar中存在的方法。 – user2604052

回答

1

我想你问的是错误的问题。您可能想知道必须访问p.xml。最好的方法是将A.jar放在类路径上,通过将其指定为“其他Maven项目”的pom.xml中的依赖项来完成。 在你的代码执行以下操作:

Foo.class.getResource("/thePackagePath/to/p.xml"); 

通过尝试访问XML作为一个文件,你让你的项目非常糟糕的移植到其他系统。

+0

我尝试过使用getClass()。getResource(xmlAbsolutePath);现在代码如下所示:File f = null; \t \t尝试{ \t \t URL resourceFile = getClass()。getResource(xmlAbsolutePath); (resourceFile!= null){ \t \t \t f = new File(resourceFile.toURI()); (“FILE EXISTS -----”+ f.exists()); \t \t} \t \t}赶上(的URISyntaxException E){ \t \t \t e.printStackTrace(); \t \t} return f;但在调试路径时,我得到它如下:jar:file:\ C:\ repository \ com \ stackOverflow \ A.jar!\ com \ stackOverflow \ A \ resources \ p.xml。任何人都可以告诉为什么“!”是目前的URI路径 – user2604052

+0

http://download.java.net/jdk7/archive/b123/docs/api/java/net/JarURLConnection.html解释了'!'的原因 –

2

如果A类(即在a.jar文件捆绑)要加载从罐子的XML和它试图访问它在你的第一个代码示例所示的方式则不访问p.xml里面你罐子。它在该位置访问文件

很容易测试这是否属于您的情况。创建完jar后,从文件系统中临时删除p.xml并运行A类。它将无法加载它。

当一个类需要加载在一个罐子里捆绑资源,那么它不使用File但类加载器。

从你提供的名字,我认为你的A类是在包:com.stackoverflow.A XML文件在下面com.stackoverflow.A.res

的所有道路的包将装入流与XML

InputStream is = null; 

// Using class - relative to the class location because path does not start with "/" 
is = SimpleWriter.class.getResourceAsStream("res/p.xml"); 

// Using class - absolute path because path starts with "/" 
is = SimpleWriter.class.getResourceAsStream("/com/stackoverflow/A/res/p.xml"); 

// Using classloader - path is *always* absolute. Note that leading "/" is missing 
is = SimpleWriter.class.getClassLoader().getResourceAsStream("com/stackoverflow/A/res/p.xml"); 
+0

我尝试使用getClass()。getResource(xmlAbsolutePath);如你所建议的现在代码如下所示:File f = null;尝试{URL resourceFile = getClass()。getResource(xmlAbsolutePath); if(resourceFile!= null){f = new File(resourceFile.toURI()); System.out.println(“FILE EXISTS -----”+ f.exists()); }} catch(URISyntaxException e){e.printStackTrace(); } return f;但在调试路径时,我得到它如下:jar:file:\ C:\ repository \ com \ stackoverflow \ A.jar!\ com \ stackoverflow \ A \ resources \ p.xml。你有什么想法为什么“!”是目前的URI路径,这是造成我的问题 – user2604052

+0

我猜这是张贴在这里意外。我没有建议使用'getResource()'。 '!'表示法对于jar文件中的路径是正常的 –

+0

如果在使用getResource()时有任何问题,并且我该如何删除!符号,以便我可以实际使用代码。任何想法都是值得欢迎的 – user2604052