2010-10-25 2 views
4

У меня есть проект, в котором я генерирую много кода для многих XSD. Чтобы удержать вещи, каждый набор XSD объединяется в рамках проекта. У меня есть несколько проектов, которые будут видеть XSD в ресурсах и генерировать код против них.Как получить доступ к ресурсам в банке, где он может присутствовать в нескольких банках

Моя проблема в том, что когда я пытаюсь получить доступ к XSD, хранящимся в файлах jar, я не могу получить код для доступа к XSD из суставной банки. Вместо этого он получит доступ к первому XSD, который соответствует критерию, независимо от фляги.

Вот код, который я использую для перечисления ресурсов. Все банки имеют ту же структуру, что и XSD всегда хранятся в папке xsd в корневом файле jar. В приведенном ниже коде содержится 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()]); 

ответ

2

Обычно я устанавливаю правило добавления каталога ресурсов в каждый JAR с ресурсами, которые являются уникальными для этого JAR, находящегося под ним. Например (в структуре Maven)

module1/src/main/resources/module1/example.xsd 
module2/src/main/resources/module2/example.xsd 

В XSDs затем с помощью ссылки

InputStream module1XSD= SomeClass.class.getResourceAsStream("/module1/example.xsd"); 
InputStream module2XSD= SomeClass.class.getResourceAsStream("/module2/example.xsd"); 

так долго, как Баночки для Module1 и module2 были размещены на пути к классам приложения, содержащего SomeClass.

Spring контексты будет ссылаться на них, как

classpath:module1/example.xsd, 
classpath:module2/example.xsd 

Это означает, что вы должны быть в состоянии переместить расположение XSDs в баночки, которые вы порождающих. Возможно, даже регенерируя их через скрипт сборки.

1

Если у всех XSD есть одно и то же имя, вам понадобятся еще один критерий со знанием того, что такое «правильный». Можете ли вы вставить в него какую-либо информацию (или с ней, например, файл свойств или что-то еще), указывающую его цель?

И, более удобный итератора, чтобы получить их могут быть:

getClass().getClassLoader().getResources("/file.xsd"); 

или что-то. (Опирается на путь к классам, будь то в файловой системе или в банке)

+0

Моя самая большая проблема здесь в том, что у меня нет доступа к XSD (они предоставляются, поэтому я должен жить с ними как есть). Кроме того, во многих случаях xsd имеют одно и то же имя. Я думал, что, предоставив класс, который, как я знал, был в том же файле jar, что и желаемый XSD, я смог бы получить загрузчик классов, который имел бы руку на этой конкретной банке, но безрезультатно. – Newtopian

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