Как получить доступ к ресурсу/конфигурации/текстовому файлу во внешнем Jar из Java?

Я запускаю программу в com.me.X.jar.

Во внешнем com.me.Y.jar у меня есть файл конфигурации, расположенный в 'config/conf.txt' в корне Jar.

Как я могу программно получить доступ к этому файлу конфигурации из Java?

com.me.Y.jar в настоящее время не загружен в память и состоит только из ресурсов, не связанных с кодом.


person user1991839    schedule 18.01.2013    source источник
comment
Включите банку в путь к классу и получите к ней доступ как к любому обычному встроенному ресурсу.   -  person MadProgrammer    schedule 19.01.2013
comment
@MadProgrammer Может быть ответом. Должен быть встроен. :)   -  person Andrew Thompson    schedule 19.01.2013
comment
Вы добавили ключевое слово OSGi, вы ищете ответ OSGi?   -  person Peter Kriens    schedule 20.01.2013


Ответы (3)


jar-файлы - это просто zip-файлы. Так что google для примера, как читать zip-файл. Или взгляните на API ZipInputStream

person MrSmith42    schedule 18.01.2013

Самый простой вариант чтения встроенных ресурсов — использовать Class.getResource или Class.getResourceAsStream.

Я могу придумать несколько способов добиться этого, в зависимости от ваших потребностей.

Добавьте com.me.Y.jar в путь к классам. Вы можете сделать это либо на системном уровне (на самом деле не рекомендуется), либо в командной строке...

java -cp com.me.Y.jar -jar com.me.X.jar

Редактировать Было указано, что аргумент -cp игнорируется с помощью приведенной выше команды, но если вы включите основной класс, он будет работать... java -cp com.me.Y.jar -jar com.me.X.jar com.me.x.Main (например)

Если это неудобно, вы можете добавить com.me.Y.jar в com.me.X.jar путь к классу манифеста который автоматически включит com.me.Y.jar для вас.

Если вы не можете этого сделать, вы можете использовать URLClassLoader для прямой загрузки com.me.Y.jar...

URL[] urls = new URL[]{new File("/path/to/com.me.Y.jar").toURI().toURL())};
URLClassLoader classLoader = new URLClassLoader(urls);
URL resource = classLoader.findResource("/config/conf.txt");

Или, если хотите, вы можете просто открыть Jar, используя java.util.JarFile, но это очень похоже на раскалывание грецких орехов ядерной бомбой... ИМХО

person MadProgrammer    schedule 18.01.2013
comment
java -cp com.me.Y.jar -jar .. Когда указано -jar, -cp игнорируется. Иди разберись. - person Andrew Thompson; 19.01.2013
comment
!! На самом деле... гы, это мило, должно быть, вместо этого используется манифест банки, ублюдки - person MadProgrammer; 19.01.2013
comment
Вы по-прежнему можете указать main явно (& class-path). java -cp com.me.Y.jar com.me.X.jar com.me.X.Main - person Andrew Thompson; 19.01.2013
comment
@AndrewThompson (единственная причина, по которой я использую # (т.е. Class#getResource), заключается в том, что в противном случае люди думают, что это статическая ссылка;)) - person MadProgrammer; 19.01.2013
comment
Вы можете отредактировать его обратно при изменении вызова CLI. Я всегда вижу, что это недействительные документы. копировать вставить. ;) - person Andrew Thompson; 19.01.2013
comment
@AndrewThompson Мне действительно следует дать ссылку на Документы, но на самом деле, если люди не могут выполнить поиск в Google, на что мы надеемся: P - person MadProgrammer; 19.01.2013

Код для получения URL

URL configURL = this.getClass().getResource("/config/conf.txt");

Manifest.mf of com.me.X.jar

См. Добавление классов в путь к классам файла JAR.

Main-Class: ...
Class-Path: com.me.Y.jar
person Andrew Thompson    schedule 18.01.2013