简体   繁体   中英

Is it possible to use the org.codehaus.mojo:build-helper-maven-plugin to bundle native dlls into a war file?

I have a group of java projects built with maven.

Now one of them depends on a native DLL, which in turns depends on several others, all of which I build as well. The final product of the build is a war file. I need these dlls to be inside that war file.

I know that one way to do it is include these dlls as resources of the respective java project. Doing so means I have to copy these dlls to the resources directory of the respective java project before that project is built.

But I am trying to explore another way and not sure whether it is just me that is doing it wrong or is it simply not possible. I am talking about the attach-artifact goal of the org.codehaus.mojo:build-helper-maven-plugin .

Here is how I am trying to do it:

The root level 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>

The native DLL's 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/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>

The Java project's 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>
  <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>

Running mvn package succeeds, the war file is created, but it does not contain any of the native DLLs. These DLLs are built just fine, but they are never copied anywhere.

I ran mvn -X . Here are the lines, which I think are relevant:

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 --

I am not that familiar with maven, so I might have omitted important parts from the log. The complete log is here - http://pastebin.com/raw.php?i=fhZCmGxB (I removed the logs of the builds of several other java projects, they all look the same, but take huge amount of space)

So my question is this - can I use the org.codehaus.mojo:build-helper-maven-plugin to do what I need - bundle native DLLs into the war?

EDIT

I have tried the approach suggested by SpaceTrucker, no errors are produced, but the resulting war remains the same - no DLL is packaged. The maven log contains the following entries:

[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

The log mentions local-driver-proxy-0.0.1.dll , but this files does not exist!

From what I see in your pom is that there is no dependency declared from the Java Project that builds the war to the project containing the native dll. You should be fine when declaring this dependency.

EDIT:
add this to the dependencies section of your war files pom:

<dependency>
  <groupId>com.shunra.localDriverProxy</groupId>
  <version>0.0.1</version>
  <artifactId>local-driver-proxy</artifactId>
  <classifier>DataStruct</classifier>
  <type>dll</type>
</dependency>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM