Нелепый шаблон в собственном плагине Maven

В настоящее время я переписываю свой проект OSS netlib-java, чтобы он был таким же простым максимально использовать как разработчиками, так и конечными пользователями.

Однако, как часть установки maven-native, мне, кажется, нужен отдельный pom.xml для каждого собственного двоичного файла, который я хочу создать. Подавляющее большинство этих файлов на самом деле идентичны на разных платформах.

Как я могу уменьшить шаблон собственных файлов сборки?, например:

(Почти все является общим для целей ОС, кроме имени выходного файла, флагов компилятора и целевой платформы для javah).

Некоторые другие меньшие, но связанные вопросы:

  • Я хочу распространять только связанные jar-файлы, как я могу отключить развертывание jnilib (и т. д.) и вместо этого развернуть jar, используя classifier по умолчанию (я могу создать jar-классификатор native, но это неудобно для конечных пользователей).
  • Очевидно, что я никогда не смогу собрать весь проект за один раз (поскольку есть несколько нативных целей ОС). Однако Maven настаивает на попытке компилировать вещи, если они являются модулями. Как я могу настроить дерево/рабочий процесс зависимостей таким образом, чтобы конечным пользователям нужно было зависеть только от одного проекта, который извлекает все собственные jar-файлы?

person fommil    schedule 28.07.2013    source источник


Ответы (1)


Функция наследования maven может значительно сократить ваш шаблонный код. Для простоты я опустил javah и другие вещи JNI и просто создал два C-проекта и общий родительский проект. Структура каталогов выглядит следующим образом:

+-NativeParent
! !
! +-src/main/native
! +-pom.xml
+-NativeTest1
! !
! +-pom.xml
+-NativeTest2
  !
  +-pom.xml

NativeParent содержит весь исходный код, а pom.xml содержит почти все определения:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

   <groupId>test</groupId>
   <artifactId>nativeParent</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>pom</packaging>

    <name>parent-pom</name>

    <modules>
        <module>../NativeTest1</module>
        <module>../NativeTest2</module>
    </modules>

    <dependencies>
    </dependencies>



   <build>
     <plugins>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>native-maven-plugin</artifactId>
         <extensions>true</extensions>
         <configuration>

           <sources>
             <source>
               <directory>../NativeParent/src/main/native</directory> 
               <fileNames>
                 <fileName>krbwinclient.c</fileName>
               </fileNames>
             </source>          
           </sources>

           <linkerStartOptions>
             <linkerStartOption>-Wl,--kill-at</linkerStartOption>
             <linkerStartOption>-shared</linkerStartOption>
           </linkerStartOptions>
           <linkerEndOptions>
            <linkerEndOption>-lSecur32</linkerEndOption>
            <linkerEndOption>-lOle32</linkerEndOption>
           </linkerEndOptions>
         </configuration>
         </plugin>

         </plugins>
    </build>

</project>

Помпы NativeTest1 и NativeTest2 могут быть довольно скудными, поскольку им нужно только определить свойства, отличные от родительского помпа.

Родной тест1:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

    <parent>
       <groupId>test</groupId>
       <artifactId>nativeParent</artifactId>
       <version>0.0.1-SNAPSHOT</version>
    </parent>

   <groupId>test</groupId>
   <artifactId>native1</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>so</packaging>

   <build>
    <finalName>native1.so</finalName>
     <plugins>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>native-maven-plugin</artifactId>
         <extensions>true</extensions>
         <configuration>
           <compilerStartOptions>
             <compilerStartOption>-Wl,--add-stdcall-alias</compilerStartOption>
             <compilerStartOption>-DBUILD_SO</compilerStartOption>
           </compilerStartOptions>

         </configuration>
         </plugin>

         </plugins>
    </build>

</project>

И НативТест2:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

    <parent>
       <groupId>test</groupId>
       <artifactId>nativeParent</artifactId>
       <version>0.0.1-SNAPSHOT</version>
    </parent>

   <groupId>test</groupId>
   <artifactId>native2</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>dll</packaging>

   <build>
    <finalName>native1.so</finalName>
     <plugins>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>native-maven-plugin</artifactId>
         <extensions>true</extensions>
         <configuration>
           <compilerStartOptions>
             <compilerStartOption>-Wl,--add-stdcall-alias</compilerStartOption>
             <compilerStartOption>-DBUILD_DLL</compilerStartOption>
           </compilerStartOptions>

         </configuration>
         </plugin>

         </plugins>
    </build>

</project>

Отличаются только тип пакета, имя цели и параметры компиляции, но большая часть конфигурации берется из файла parent-pom.

Обратите внимание, что есть только одно свойствоcompileStartOption-Property, поэтому, хотя вы можете использовать несколько атрибутов с одинаковыми именами в дочерней помпе, вы потеряете все записи с одинаковыми именами из родительской помпы.

Я надеюсь, что это то, что вы искали - это все еще немного шаблонного кода, но он значительно сокращен.

person piet.t    schedule 08.08.2013
comment
спасибо, я должен был это сделать (что немного помогает). Наибольшее количество шаблонов возникает из-за повторения трех целей execution... можно ли использовать этот родительский подход pom и для этого? - person fommil; 09.08.2013