У меня есть проект, в котором я генерирую много кода для многих XSD.Чтобы отделить вещи друг от друга, каждый набор XSD связан в рамках проекта.У меня есть несколько проектов, которые будут видеть XSD в ресурсах и генерировать для них код.
Моя проблема заключается в том, что при попытке получить доступ к XSD, хранящемуся в файлах jar, я не могу получить код для доступа к XSD изперкулярная банка.Вместо этого он получит доступ к первому XSD, который соответствует критерию независимо от jar.
Вот код, который я использую для перечисления ресурсов. Все jar имеют одинаковую структуру, то есть XSD всегда хранятся в папке xsd.в корне файла фляги.Код ниже перечисляет XSD в папке.
URL dirURL = clazz.getClassLoader().getResource(path);
System.out.println(dirURL.toURI());
if (dirURL != null && dirURL.getProtocol().equals("file")) {
/* A file path: easy enough */
System.out.println(dirURL.toURI());
return new File(dirURL.toURI()).list();
}
if (dirURL == null) {
/*
* In case of a jar file, we can't actually find a directory.
* Have to assume the same jar as clazz.
*/
String me = clazz.getName().replace(".", "/") + ".class";
dirURL = clazz.getClassLoader().getResource(me);
System.out.println(dirURL.toURI());
System.out.println(me);
}
if (dirURL.getProtocol().equals("jar")) {
/* A JAR path */
String jarPath = dirURL.getPath().substring(5, dirURL.getPath().indexOf("!")); //strip out only the JAR file
System.out.println(jarPath);
JarFile jar = new JarFile(URLDecoder.decode(jarPath, "UTF-8"));
Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar
Set<String> result = new HashSet<String>(); //avoid duplicates in case it is a subdirectory
String name = null;
while (entries.hasMoreElements()) {
name = entries.nextElement().getName();
if (name.startsWith(path)) { //filter according to the path
String entry = name.substring(path.length());
int checkSubdir = entry.indexOf("/");
if (checkSubdir >= 0) {
// if it is a subdirectory, we just return the directory name
entry = entry.substring(0, checkSubdir);
}
result.add(entry);
}
}
return result.toArray(new String[result.size()]);