繁体   English   中英

是否可以使用org.codehaus.mojo:build-helper-maven-plugin将本机dll捆绑到war文件中?

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

我有一组用maven构建的Java项目。

现在,其中一个依赖于本机DLL,而后者又依赖于其他几个DLL,我也构建了所有这些。 构建的最终产品是战争文件。 我需要这些dll放在该war文件中。

我知道一种方法是将这些dll包含为各自java项目的资源。 这样做意味着我必须在构建该项目之前将这些dll复制到相应Java项目的资源目录中。

但是我正在尝试另一种方式,不确定是做错了还是只是我做错了。 我说的是org.codehaus.mojo:build-helper-maven-pluginattach-artifact目标。

这是我尝试执行的操作:

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

本机DLL的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>

Java项目的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>

运行mvn package成功,将创建war文件,但其中不包含任何本机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 ,但该文件不存在!

根据我在pom中看到的,Java项目没有声明任何依赖关系,而该依赖关系会向包含本机dll的项目构建战争。 声明此依赖关系时应该没问题。

编辑:
将其添加到war文件pom的dependencies部分:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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