Как загрузить / найти JAR-ресурс изнутри скрипта GMaven?
Это мой скрипт 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 ответа
Ответ очень простой:
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
Остальное тривиально.
Если файл находится в Jar, то технически это не файл, а запись Jar. Это означает, что у вас есть эти возможности:
- Загрузите это как
InputStream
используя ClassLoader или ручную обработку Jar - Извлеките его в файл (возможно, с
dependency:unpack
или жеdependency:unpack-dependencies
)
Я не уверен, как разрешить путь к jar-файлу к внешнему репозиторию, но, предполагая, что jar находится в вашем локальном репозитории, вы должны иметь к нему доступ через settings.localRepository
неявная переменная. Затем вы уже знаете свою группу и идентификатор артефакта, поэтому путь к банке в этом случае будет settings.localRepository + "/my-group/my-artifact/1.0/my-artifact-1.0.jar"
Этот код должен позволить вам прочитать файл 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()
}