2013-07-21 4 views
1

Существует проект maven A. Когда я делаю mvn clean install, проект строится, и jar доступен в моем локальном репозитории, т.е. c: \ repository \ com \ stackoverflow \ A \ a.jarНевозможно загрузить xml-файл с абсолютного пути

a.jar содержит несколько классов и XML-файлы, используемые этими классами

с другой Maven проекта я ссылающегося один из методов в классе, который использует один 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; 

} 

Может кто-нибудь пожалуйста, дайте мне знать, где я неправильно. Почему он не выбирает xml из репозитория, который присутствует на диске C.

+0

Непонятно, где находится ваш XML-файл. Вы пытаетесь загрузить его из банки или из файловой системы? –

+0

Файл xml присутствует в папке ресурсов в A.jar. Ящик присутствует в репозитории, который находится на диске C. Обратите внимание, что я правильно добавил зависимость, и я могу правильно получить доступ к методам, присутствующим в A.jar из проекта B. – user2604052

ответ

1

Думаю, вы задаете неправильный вопрос. Вы, вероятно, хотите знать, должен получить доступ к p.xml. Лучший способ - поместить A.jar в путь класса, который вы делаете, указав его как зависимость в pom.xml «другого проекта Maven». В своем коде вы делаете следующее:

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

При попытке доступа к XML как файл, вы сделаете ваш проект очень плохо для других систем.

+0

Я пробовал использовать getClass().getResource (xmlAbsolutePath); теперь код выглядит следующим образом: File f = null; \t \t try { \t \t URL resourceFile = getClass(). GetResource (xmlAbsolutePath); \t \t if (resourceFile! = Null) { \t \t \t f = новый Файл (resourceFile.toURI()); \t \t \t System.out.println ("FILE EXISTS -----" + f.exists()); \t \t} \t \t} задвижка (URISyntaxException е) { \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 из jar, и он пытается получить к нему доступ таким образом, как показано в примере вашего первого кода, тогда он не имеет доступа к p.xml внутри вашего jar. Он обращается к файлу в этом месте.

Легко проверить, если это ваш случай. После создания баннера временно удалите p.xml из файловой системы и запустите класс A. Он не сможет загрузить его.

Когда класс должен загружать ресурс, который поставляется в банке, он не использует File, но загрузчик классов.

Из названия вы предоставляете, я полагаю, что ваш класс А в пакете: 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; try {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 \ res ources \ p.xml. У вас есть идея, почему «!» есть путь URI, который вызывает мою проблему. – user2604052

+0

Я предполагаю, что это отправлено здесь случайно. Я не предлагаю использовать 'getResource()'. Обозначение '!' Является нормальным для путей внутри файла jar. –

+0

. Не могли бы вы сообщить мне, есть ли какие-либо проблемы при использовании getResource(), а также как я могу удалить! чтобы я мог использовать код. Любая идея приветствуется. – user2604052

Смежные вопросы