2012-03-02 3 views
0

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

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

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

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

Крис

+0

Да, сборка плагина должна быть в порядке. Можете ли вы показать, что вам нравится в содержимом файла jar? –

+0

Я отвечу на ваш вопрос в главном «ответе», потому что SO keept на испортить мои строки :-) –

ответ

0

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

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

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

Здесь приходит код компонента:

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/сплетение/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

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

Модуль de.cware.utils: LIB -psexec-клиент:

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

Модуль de.cware.utils: Lib-PsExec-сервис: выводит файл под названием «service.exe»

Я хочу, чтобы результат выглядел как клиентская банка, но также содержал «service.exe», поэтому я могу загрузить его из кода в банке клиента.

Module de.cware.utis: Lib-PsExec сборки:

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

Ну, мне действительно удалось решить мою проблему: решение заключалось в реализации пользовательского PlexusIoResourceCollection и ссылки на него как на зависимость в плагин сборки. –

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