Maven 3: Сборка файла Jar, содержащего двоичные ресурсы - PullRequest
0 голосов
/ 02 марта 2012

Я установил проект Maven, состоящий из двух дочерних модулей, одного модуля Java Jar и одного создания исполняемого файла Windows с использованием NPanday.Моя сборка работает отлично.

Проблема, с которой я столкнулся, заключается в том, что я хотел бы создать файл Jar, содержащий мою библиотеку Java, и иметь встроенный файл Exe, чтобы я мог загрузить его как ресурс из кода внутриlib.

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

Не мог бы кто-нибудь здесь подсказать мне правильный путь или дать подсказку о том, как должен выглядеть такой дескриптор сборки?

Крис

Ответы [ 2 ]

0 голосов
/ 02 марта 2012

Хорошо ... так что, похоже, я сам разобрался с решением.Я знаю, что этот вопрос снова был относительно особенным ... так как все мои вопросы, кажется, таковы: -)

Решением было создание модуля maven, содержащего пользовательскую реализацию PlexusIoResourceCollection и ссылки на него из компонентов.XML-файл в каталоге «META-INF / plexus».

После добавления этого в качестве зависимости к моему сборочному плагину я смог вставить exe-файлы в свой jar-файл: -)

Вот код компонента:

package npanday.plugin.archiver;

import org.codehaus.plexus.components.io.resources.PlexusIoCompressedFileResourceCollection;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created with IntelliJ IDEA.
 * User: cdutz
 * Date: 02.03.12
 * Time: 12:04
 */
public class PlexusIoExeResourceCollection extends PlexusIoCompressedFileResourceCollection {

    @Override
    protected String getDefaultExtension() {
        return ".exe";
    }

    @Override
    protected InputStream getInputStream(File file) throws IOException {
        // Simply return an InputStream to the resource file.
        // This will make it embed the source as a whole.
        return new FileInputStream(file);
    }

    @Override
    public String getPath() {
        // Without overriding this, the exe would be included with its full path.
        // This way it is included directly in the root of the result archive.
        return super.getFile().getName();
    }

}

Здесь конфиг xml в META-INF / plexus / components.xml

<component-set>
    <components>
        <component>
              <role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
              <role-hint>exe</role-hint>
              <implementation>npanday.plugin.archiver.PlexusIoExeResourceCollection</implementation>
              <instantiation-strategy>per-lookup</instantiation-strategy>
            </component>
    </components>
</component-set>

И, наконец, использование в моем сборочном плагине:

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2.1</version>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.apache.npanday.plugins</groupId>
                    <artifactId>maven-exe-archiver-plugin</artifactId>
                    <version>${npanday.version}</version>
                </dependency>
            </dependencies>
        </plugin>

Надеюсь, это будеттрюк для меня.

0 голосов
/ 02 марта 2012

Ну, у меня есть Java-проект, который пока содержит только тестовый класс, так как я все еще на стадии настройки моей сборки:

Модуль de.cware.utils: lib-psexec-client:

  • / de / cware / utils / psexec / client / Test.java

Модуль de.cware.utils: lib-psexec-service: выводит файл с именем"service.exe"

Я хочу, чтобы вывод был похож на jar-файл клиента, но также содержал "service.exe", чтобы я мог загрузить его из кода в jar-файле клиента.

Модуль de.cware.utis: lib-psexec-Assembly:

  • / de / cware / utils / psexec / client / Test.java
  • / service.exe
...