Можно ли использовать org.codehaus.mojo:build-helper-maven-plugin для объединения собственных dll в военный файл?

У меня есть группа java-проектов, созданных с помощью maven.

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

Я знаю, что один из способов сделать это - включить эти DLL в качестве ресурсов соответствующего проекта Java. Это означает, что я должен скопировать эти библиотеки DLL в каталог ресурсов соответствующего проекта Java до того, как этот проект будет построен.

Но я пытаюсь исследовать другой путь и не уверен, что это только я делаю это неправильно или это просто невозможно. Я говорю о attach-artifact цели org.codehaus.mojo:build-helper-maven-plugin.

Вот как я пытаюсь это сделать:

Корневой уровень 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>com.shunra</groupId>
  <name>VCat-build</name>
  <version>1.0.0.SNAPSHOT</version>
  <artifactId>VCat-build</artifactId>
  <packaging>pom</packaging>
  <modules>
    <module>../../../../DriverProxy</module>
    <module>../../../VCat</module>
    <!-- More modules follow -->
  </modules>
  <build>
    <plugins>
    </plugins>
  </build>
</project>

pom.xml родной DLL:

<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.shunra.localDriverProxy</groupId>
  <version>0.0.1</version>
  <artifactId>local-driver-proxy</artifactId>
  <packaging>pom</packaging>
  <name>Local Driver Proxy</name>
  <properties>
    <msbuild.exe>C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe</msbuild.exe>
    <msbuild.configuration>StratusRelease</msbuild.configuration>
  </properties>
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <version>1.2.1</version>
        <configuration>
          <executable>${msbuild.exe}</executable>
          <workingDirectory>${basedir}</workingDirectory>
        </configuration>
        <executions>
          <execution>
            <id>clean-with-msbuild</id>
            <phase>clean</phase>
            <goals>
              <goal>exec</goal>
            </goals>
            <configuration>
              <arguments>
                <argument>/t:Clean</argument>
                <argument>/p:Configuration=${msbuild.configuration}</argument>
                <argument>LocalDriverProxy.sln</argument>
              </arguments>
            </configuration>
          </execution>
          <execution>
            <id>build-with-msbuild</id>
            <phase>compile</phase>
            <goals>
              <goal>exec</goal>
            </goals>
            <configuration>
              <arguments>
                <argument>/t:Build</argument>
                <argument>/p:Configuration=${msbuild.configuration}</argument>
                <argument>LocalDriverProxy.sln</argument>
              </arguments>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <id>attach-local-driver-proxy</id>
            <phase>package</phase>
            <goals>
              <goal>attach-artifact</goal>
            </goals>
            <configuration>
              <artifacts>
                <artifact>
                  <file>${basedir}/../Distribution/DataStruct.dll</file>
                  <classifier>DataStruct</classifier>
                  <type>dll</type>
                </artifact>
                <artifact>
                  <file>${basedir}/../Distribution/GraphSetup.dll</file>
                  <classifier>GraphSetup</classifier>
                  <type>dll</type>
                </artifact>
                <!-- more artifacts follow -->
              </artifacts>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

pom.xml проекта Java:

<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>com.shunra</groupId>
  <artifactId>vcat</artifactId>
  <version>0.0.1</version>
  <packaging>war</packaging>

  <properties>
    <java-version>1.6</java-version>
    <org.springframework-version>3.1.0.RELEASE</org.springframework-version>
    <org.aspectj-version>1.6.9</org.aspectj-version>
    <org.slf4j-version>1.5.10</org.slf4j-version>
  </properties>
  <dependencies>
    <!-- Quite a few dependencies follow -->
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source/>
          <target/>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.0.1</version>
        <configuration>
          <webappDirectory>target/exploded</webappDirectory>
          <archive>
            <!-- <manifest>
               <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
               <addClasspath>true</addClasspath>
           </manifest> -->
          </archive>
        </configuration>

        <executions>
          <execution>
            <id>prepare-war</id>
            <phase>prepare-package</phase>
            <goals>
              <goal>exploded</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Выполнение mvn package завершается успешно, файл войны создается, но он не содержит родных библиотек DLL. Эти библиотеки DLL прекрасно создаются, но они никогда никуда не копируются.

Я побежал mvn -X. Вот строки, которые я считаю важными:

Apache Maven 3.0.4 (r1232337; 2012-01-17 03:44:56-0500)
Maven home: o:\java\apache-maven-3.0.4
Java version: 1.6.0_27, vendor: Sun Microsystems Inc.
Java home: c:\Program Files\Java\jdk1.6.0_27\jre
.
.
.
[DEBUG] -----------------------------------------------------------------------
[DEBUG] Goal:          org.codehaus.mojo:build-helper-maven-plugin:1.7:attach-artifact (attach-local-driver-proxy)
[DEBUG] Style:         Regular
[DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <artifacts>
    <artifact>
      <file>C:\dev\shunra\DriverProxy/../Distribution/DataStruct.dll</file>
      <classifier>DataStruct</classifier>
      <type>dll</type>
    </artifact>
    <artifact>
      <file>C:\dev\shunra\DriverProxy/../Distribution/GraphSetup.dll</file>
      <classifier>GraphSetup</classifier>
      <type>dll</type>
    </artifact>
    .
    .
    .
  </artifacts>
  <basedir>${basedir}</basedir>
  <mavenSession>${session}</mavenSession>
  <project>${project}</project>
  <runOnlyAtExecutionRoot default-value="false">${buildhelper.runOnlyAtExecutionRoot}</runOnlyAtExecutionRoot>
  <skipAttach default-value="false">${buildhelper.skipAttach}</skipAttach>
</configuration>
[DEBUG] =======================================================================
[DEBUG] com.shunra.localDriverProxy:local-driver-proxy:pom:0.0.1
.
.
.
[INFO] --- build-helper-maven-plugin:1.7:attach-artifact (attach-local-driver-proxy) @ local-driver-proxy ---
[DEBUG] org.codehaus.mojo:build-helper-maven-plugin:jar:1.7:
.
.
.
[DEBUG]    org.codehaus.plexus:plexus-utils:jar:1.5.8:compile
[DEBUG] Created new class realm plugin>org.codehaus.mojo:build-helper-maven-plugin:1.7
[DEBUG] Importing foreign packages into class realm plugin>org.codehaus.mojo:build-helper-maven-plugin:1.7
[DEBUG]   Imported:  < maven.api
[DEBUG] Populating class realm plugin>org.codehaus.mojo:build-helper-maven-plugin:1.7
[DEBUG]   Included: org.codehaus.mojo:build-helper-maven-plugin:jar:1.7
.
.
.
[DEBUG]   Excluded: org.apache.maven:maven-artifact:jar:2.0.6
[DEBUG] Configuring mojo org.codehaus.mojo:build-helper-maven-plugin:1.7:attach-artifact from plugin realm ClassRealm[plugin>org.codehaus.mojo:build-helper-maven-plugin:1.7, parent: sun.misc.Launcher$AppClassLoader@3326b249]
[DEBUG] Configuring mojo 'org.codehaus.mojo:build-helper-maven-plugin:1.7:attach-artifact' with basic configurator -->
[DEBUG]   (s) file = C:\dev\shunra\DriverProxy\..\Distribution\DataStruct.dll
[DEBUG]   (s) classifier = DataStruct
[DEBUG]   (s) type = dll
[DEBUG]   (s) file = C:\dev\shunra\DriverProxy\..\Distribution\GraphSetup.dll
[DEBUG]   (s) classifier = GraphSetup
[DEBUG]   (s) type = dll
.
.
.
[DEBUG]   (f) artifacts = [org.codehaus.mojo.buildhelper.Artifact@7e79b177, ...]
[DEBUG]   (f) basedir = C:\dev\shunra\DriverProxy
[DEBUG]   (f) mavenSession = org.apache.maven.execution.MavenSession@37567e6c
[DEBUG]   (f) project = MavenProject: com.shunra.localDriverProxy:local-driver-proxy:0.0.1 @ C:\dev\shunra\DriverProxy\pom.xml
[DEBUG]   (f) runOnlyAtExecutionRoot = false
[DEBUG]   (f) skipAttach = false
[DEBUG] -- end configuration --

Я не так хорошо знаком с maven, поэтому я мог пропустить важные части из журнала. Полный журнал находится здесь - http://pastebin.com/raw.php?i=fhZCmGxB (я удалил логи сборок нескольких других java проектов, они все выглядят одинаково, но занимают огромное количество места)

Итак, мой вопрос заключается в следующем: могу ли я использовать org.codehaus.mojo:build-helper-maven-plugin для выполнения того, что мне нужно, — связать родные библиотеки DLL с войной?

ИЗМЕНИТЬ

Я попробовал подход, предложенный SpaceTrucker, никаких ошибок не выдается, но результирующая война остается прежней - никакая DLL не упакована. Журнал maven содержит следующие записи:

[DEBUG] =======================================================================
[DEBUG] com.shunra:vcat:war:0.0.1
.
.
.
[DEBUG]    com.shunra.localDriverProxy:local-driver-proxy:dll:DataStruct:0.0.1:compile
.
.
.
[INFO] Exploding webapp...
[INFO] Copy webapp webResources to C:\dev\shunra\Application\VCat\target\exploded
[INFO] Assembling webapp vcat in C:\dev\shunra\Application\VCat\target\exploded
[DEBUG] Processing: spring-context-3.1.0.RELEASE.jar
.
.
.
[DEBUG] Processing: local-driver-proxy-0.0.1.dll
[DEBUG] Skipping artifact of type dll for WEB-INF/lib
[INFO] 
[INFO] --- maven-war-plugin:2.0.1:war (default-war) @ vcat ---
[DEBUG] Configuring mojo org.apache.maven.plugins:maven-war-plugin:2.0.1:war from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-war-plugin:2.0.1, parent: sun.misc.Launcher$AppClassLoader@3326b249]
.
.
.
[DEBUG] -- end configuration --
[INFO] Exploding webapp...
[INFO] Copy webapp webResources to C:\dev\shunra\Application\VCat\target\exploded
[INFO] Assembling webapp vcat in C:\dev\shunra\Application\VCat\target\exploded
[DEBUG] Processing: spring-context-3.1.0.RELEASE.jar
.
.
.
[DEBUG] Processing: local-driver-proxy-0.0.1.dll
[DEBUG] Skipping artifact of type dll for WEB-INF/lib
[INFO] Generating war C:\dev\shunra\Application\VCat\target\vcat-0.0.1.war

В журнале упоминается local-driver-proxy-0.0.1.dll, но этих файлов не существует!


person mark    schedule 09.01.2013    source источник
comment
Связанный вопрос stackoverflow.com/q/9940273/116509   -  person artbristol    schedule 09.01.2013
comment
Этот вопрос не актуален. Я знаю, что могу упаковать родные dll, и я даже упоминаю в теле вопроса, что могу поместить файлы в ресурсы, и это заставит их упаковать в войну. Меня особенно интересует org.codehaus.mojo:build-helper-maven-plugin, и в этом вопросе он никогда не упоминается.   -  person mark    schedule 09.01.2013
comment
Вам решать. Удачи вам в любых делах с DLL, когда она окажется в вашей войне.   -  person artbristol    schedule 09.01.2013


Ответы (1)


Из того, что я вижу в вашем pom, так это то, что из Java-проекта, который создает войну, не объявлена ​​​​зависимость от проекта, содержащего нативную dll. Вы должны быть в порядке при объявлении этой зависимости.

РЕДАКТИРОВАТЬ:
добавьте это в раздел dependencies ваших военных файлов pom:

<dependency>
  <groupId>com.shunra.localDriverProxy</groupId>
  <version>0.0.1</version>
  <artifactId>local-driver-proxy</artifactId>
  <classifier>DataStruct</classifier>
  <type>dll</type>
</dependency>
person SpaceTrucker    schedule 09.01.2013
comment
Я попробую ваше предложение. Я очень новичок в maven, поэтому, если бы вы могли выделить несколько примеров строк, это избавило бы меня от поиска в Google. - person mark; 09.01.2013
comment
Вы уверены, что это все, что мне нужно сделать? Потому что я добавил эту зависимость в войну, генерирующую pom.xml, и получил вот это: [ERROR] Failed to execute goal on project vcat: Could not resolve dependencies for project com.shunra:vcat:war:0.0.1: Could not find artifact com.shunra.localDriverProxy:local-driver-proxy:dll:0.0.1 in central (http://repo.maven.apache.org/maven2) -> [Help 1] - person mark; 09.01.2013
comment
@mark Я забыл тег classifier во фрагменте XML. Я не совсем уверен, что это сработает, если вы зависите от DataStruct и GraphSetup одновременно. Если это не так, вам придется создать отдельный pom для каждой dll. - person SpaceTrucker; 09.01.2013
comment
Ну не работает - смотрите РЕДАКТИРОВАТЬ. И создание отдельного pom для каждой dll - это своего рода неприятность. Мне нужен другой подход. Думаю, мне просто нужно будет упаковать их как ресурсы или что-то в этом роде. - person mark; 09.01.2013
comment
@mark Вы должны убедиться, что плагин сборки maven также включает dll. Пожалуйста, ознакомьтесь с его документацией - maven.apache.org/plugins/maven -assembly-plugin — возможно, об этом уже спрашивали на SO. - person SpaceTrucker; 09.01.2013
comment
Задача становится слишком сложной. Я просто включу их в качестве ресурсов. +1 за усилия. Спасибо. - person mark; 09.01.2013