У меня есть вспомогательный класс I18n
, который может узнать доступные Locale
s, посмотрев на имена файлов внутри Jar приложения.
private static void addLocalesFromJar(List<Locale> locales) throws IOException {
ProtectionDomain domain = I18n.class.getProtectionDomain();
CodeSource src = domain.getCodeSource();
URL url = src.getLocation();
JarInputStream jar = new JarInputStream(url.openStream());
while (true) {
JarEntry entry = jar.getNextJarEntry();
if (entry == null) {
break;
}
String name = entry.getName();
// ...
}
}
В настоящее время это не работает - jar.getNextJarEntry()
, кажется, всегда возвращает null
. Я понятия не имею, почему это происходит, все, что я знаю, это то, что url
установлено на rsrc:./
. Я никогда не видел этот протокол и не мог найти в нем ничего.
Любопытно, что это работает:
class Main {
public static void main(String[] args) {
URL url = Main.class.getProtectionDomain().getCodeSource().getLocation();
JarInputStream jar = new JarInputStream(url.openStream());
while (true) {
JarEntry entry = jar.getNextJarEntry();
if (entry == null) {
break;
}
System.out.println(entry.getName());
}
}
}
В этой версии, хотя между ними практически нет различий, url
правильно задан путь к файлу Jar.
Почему не работает первая версия и что ее нарушает?
UPDATE
Рабочий пример действительно работает, только если я не использую Eclipse для его экспорта. В NetBeans все работало нормально, но в версии Eclipse URL-адрес также был установлен на rsrc:./
.
Так как я экспортировал его с обработкой библиотеки Package required libraries into generated JAR
, Eclipse поместил его jarinjarloader
в мой Jar-файл, чтобы у меня были все зависимости внутри него. Он отлично работает с другими настройками, но есть ли способ сделать эту работу независимо от них?
Другой вопрос
В данный момент этот класс является частью моего приложения, но я планирую поместить его в отдельную библиотеку. В таком случае, как я могу убедиться, что он будет работать с отдельными банками?