Как загрузить / найти JAR-ресурс изнутри скрипта GMaven? - PullRequest
2 голосов
/ 24 февраля 2011

Это мой gmaven скрипт, который пытается найти и загрузить файл, расположенный где-то внутри предоставленной зависимости (это раздел pom.xml):

[...]
<plugin>
  <groupId>org.codehaus.gmaven</groupId>
  <artifactId>gmaven-plugin</artifactId>
  <executions>
    <execution>
      <configuration>
        <source>
          <![CDATA[
          def File = // how to get my-file.txt?
          ]]>
        </source>
      </configuration>
    </execution>
  </executions>
  <dependencies>
    <dependency>
      <groupId>my-group</groupId>
      <artifactId>my-artifact</artifactId>
      <version>1.0</version>
    </dependency>
  </dependencies>
</plugin>
[...]

my-file.txt находится в my-group:my-artifact:1.0 файле JAR.

Ответы [ 3 ]

2 голосов
/ 07 марта 2011

Ответ очень прост:

def url = getClass().getClassLoader().getResource("my-file.txt");

Тогда URL будет в следующем формате:

jar:file:/usr/me/.m2/repository/grp/art/1.0-SNAPSHOT/art.jar!/my-file.tex

Остальное тривиально.

0 голосов
/ 03 марта 2011

Я не уверен, как разрешить путь к jar-файлу к внешнему репозиторию, но, предполагая, что jar находится в вашем локальном репозитории, вы должны иметь доступ к нему через неявную переменную settings.localRepository.Затем вы уже знаете идентификатор своей группы и артефакта, поэтому путь к вашему банку в этом случае будет settings.localRepository + "/my-group/my-artifact/1.0/my-artifact-1.0.jar"

Этот код должен позволить вам прочитать файл банку и получить из него текстовый файл.Примечание. Обычно я не пишу этот код для чтения файла в байт [], я просто поместил его здесь для полноты.В идеале используйте что-то из Apache Commons или подобную библиотеку, чтобы сделать это:

    def file = null
    def fileInputStream = null
    def jarInputStream = null
    try {
        //construct this with the path to your jar file. 
        //May want to use a different stream, depending on where it's located
        fileInputStream = new FileInputStream("$settings.localRepository/my-group/my-artifact/1.0/my-artifact-1.0.jar")
        jarInputStream = new JarInputStream(fileInputStream)

        for (def nextEntry = jarInputStream.nextEntry; (nextEntry != null) && (file == null); nextEntry = jarInputStream.nextEntry) {
            //each entry name will be the full path of the file, 
            //so check if it has your file's name
            if (nextEntry.name.endsWith("my-file.txt")) {
                file = new byte[(int) nextEntry.size]
                def offset = 0
                def numRead = 0
                while (offset < file.length && (numRead = jarInputStream.read(file, offset, file.length - offset)) >= 0) {
                  offset += numRead
                }
            }
        }
    }
    catch (IOException e) {
        throw new RuntimeException(e)
    }
    finally {
        jarInputStream.close()
        fileInputStream.close()
    }
0 голосов
/ 24 февраля 2011

Если файл находится в Jar, то технически это не файл, а запись Jar. Это означает, что у вас есть эти возможности:

  • Загрузите его как InputStream, используя либо ClassLoader или ручная обработка банок
  • Извлеките его в файл (возможно, с dependency:unpack или dependency:unpack-dependencies)
...