У меня есть два проекта в eclipse foo
и bar
. bar
включен как часть foo
используя конфигурацию пути сборки в eclipse. Это позволяет мне получить доступ ко всем файлам Java, которые мне нужны из bar
внутри foo
.
Тем не менее, у меня также есть некоторые документы справки PDF, которые содержатся внутри bar
. Эти файлы содержатся в каталоге help/
. Когда я пытаюсь получить доступ к таким файлам, help/file.pdf
, он работает в bar
, но не foo
.
Как я могу получить доступ к этим файлам PDF в foo
?
Вопрос &
Как файлы доступны? Доступ к файлам осуществляется путем поиска пути к классу ресурса. (т.е. getClassLoader().getResource(path)
)
Используя параметр "Путь сборки" в среде Eclipse IDE, вы устанавливаете IDE для добавления пути к расположению файлов классов "bar" в пути класса JVM, то есть "bin". И вы можете получить любой ресурс через эти пути.
Для получения ресурса вам понадобится класс, потому что JVM возвращает ресурсы, беря этот класс в качестве ссылки.
Пусть Anchor
будет классом в пакете help
bar
проекта.
Вот код в классе в проекте foo
.
URL url = bar.Anchor.class.getResource("file.pdf");
System.out.println(url);
Вы не можете получить ресурс напрямую (не принимая класс в качестве ссылки).
Это связано с тем, что JVM в основном ведет учет только файлов.class, которые находятся на своем пути.
Но если вы все еще хотите получить файл без использования какого-либо файла.class в качестве ссылки, то это можно сделать, просто используя класс File (location_of_file). Это простой метод, и я знаю, что вы этого не хотите.
Если вы хотите получить файл только по пути, который вы установили с помощью "Путь сборки", вам нужно будет проверить этот файл в пути к классам JVM.
Чтобы получить путь к классу, вам нужно будет вызвать метод System.getProperty() и получить свойство "java.class.path". Затем проверьте все пути, присутствующие в пути к классам.
File file = new File("help","file.pdf"); //'file.pdf' file in 'help' folder
String classpath = System.getProperty("java.class.path");
StringTokenizer tokenizer = new StringTokenizer(classpath,";");
while(tokenizer.hasMoreTokens()){
File temp = new File(tokenizer.nextToken(), file);
if(temp.exists()){
// here you get your file as 'temp'.
// If you want it to be in URL form, you can convert it.
break;
}
}
bar
bin
....//созданный IDE (его местоположение задано в пути класса, src
help
Anchor.java
file.pdf
foo
src
Accessor.java
Чтобы достичь этого, help
должна быть исходной папкой панели проекта. Таким образом, все содержимое help
будет скопировано, чтобы ограничить местоположение вывода и, таким образом, доступным для foo
.
Если вы включили bar
как часть foo
используя конфигурацию ванны для сборки в Eclipse, bar
находится в пути сборки, когда компиляция foo
.
Корреспондент построил артефакт для bar
(например, файл jar), также должен находиться в пути к классам во время выполнения. Для этого вам необходимо настроить развертывание; делать это в Eclipse отличается от проектов разных типов. Какой проект является foo
?
Теперь, если у вас есть проект в пути к классам (сборка или время выполнения), вы можете найти ресурсы в нем, используя загрузчик классов.
Предполагая, что вы добавили справочную папку в качестве исходной папки в bar
и у вас есть класс com.mycompany.MyClass
в foo
, вы можете получить URL своего ресурса в foo
используя следующее:
java.net.URL pdfUrl = com.mycompany.MyClass.class.getResource("/help/file.pdf");
Затем с помощью этого URL-адреса вы можете открыть поток для чтения своего ресурса:
java.io.InputStream is = url.openStream();
help
в путь сборки в качестве исходной папки. Проблема в том, что eclipse может связать папку, но JVM не знает об этой связи.