Как получить доступ к ресурсам в банке, где он может присутствовать в нескольких банках - PullRequest
4 голосов
/ 25 октября 2010

У меня есть проект, в котором я генерирую много кода для многих 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()]);

Ответы [ 2 ]

2 голосов
/ 26 октября 2010

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

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

XSD затем ссылаются на

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

, пока JAR-файлы для module1 и module2 помещены в путь к классу приложения, содержащего SomeClass.

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

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

Это означает, что вам нужно будет перемещать расположение XSD в создаваемых вами JAR-файлах. Может быть, даже восстановить их с помощью сценария сборки.

1 голос
/ 25 октября 2010

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

И более удобным итератором для их получения может быть:

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

или что-то.(Зависит от пути к классам, независимо от того, находится ли он в файловой системе или в банке)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...