使用Maven为JNLP创建一个包含jar-with-dependencies.jar的.war文件

时间:2012-04-16 20:28:25

标签: java maven jnlp java-web-start

我有一个Maven项目,它将Swing客户端构建为jar-with-dependencies.jar文件。我想使用Java Web Start来分发这个my.gui-0.1.0-jar-with-dependencies.jar文件。我创建了一个单独的Maven项目,为此目的使用JNLP工件构建.war文件。我需要在这个.war文件中包含my.gui-0.1.0-jar-with-dependencies.jar。

我无法确定jar-with-dependencies.jar文件的Maven坐标。如果我使用GUI项目的Maven坐标,它将GUI项目的依赖项.jar文件放在WEB-INF / lib中,这不是我想要的。我需要在.war文件中拥有my.gui-0.1.0-jar-with-dependencies.jar文件。 (我想它可能在WEB-INF / lib中。)

如何告诉Maven依赖项是jar-with-dependencies.jar文件本身?

如果除了机制之外还有另一种方法告诉M​​aven包含jar-with-dependencies.jar本身也可以。 jar-with-dependencies.jar必须位于我正在创建的.war文件中以支持Java Web Start。

我知道有一个Maven Webstart插件,但是that looks like a nightmare所以我只是用自己必要的JNLP工件构建一个.war文件。

2 个答案:

答案 0 :(得分:4)

首先,您想要的是WAR文件的用户可以下载的JAR文件。将文件包含在WEB-INF / lib中作为WAR项目的标准依赖项并不是您想要的。您最想要的是将JAR放在WAR的不同目录中(例如/downloads)。

要在Maven中实现此目的,您可以使用Maven Dependency Plugin

1:使用依赖插件{J}文件copy到临时构建目录。

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.4</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>generate-resources</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>my.group</groupId>
                  <artifactId>myartifact</artifactId>
                  <version>1.0</version>
                  <type>jar</type>
                  <overWrite>false</overWrite>
                  <outputDirectory>${project.build.directory}/webapp-downloads</outputDirectory>
                  <destFileName>myartifact.jar</destFileName>
                </artifactItem>
              </artifactItems>
            </configuration>
          </execution>
        </executions>
      </plugin>

这里我们将您的JAR文件复制到$ {project.build.directory/webapp-downloads目录

2:配置WAR插件以包含依赖插件生成的资源。

      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <webResources>
            <resource>                  
              <directory>${project.build.directory/webapp-downloads</directory>
              <targetPath>downloads</targetPath>
            </resource>
          </webResources>
        </configuration>
      </plugin>

这将导致JAR文件捆绑在downloads目录下的WAR中。然后,用户可以通过转至/downloads/myartifact.jar下载它来下载它。

对于webstart,您可以使用适当的路径配置JNLP,而不是让用户直接下载JAR。

答案 1 :(得分:0)

如果你想复制.jnlp文件,就像我的情况一样,你可以使用解包目标。这是因为webstart-maven-plugin可以将jar和jnlp文件打包成zip。

<execution>
    <id>unpack</id>
    <phase>process-resources</phase>
    <goals>
          <goal>unpack</goal>
    </goals>
    <configuration>
        <artifactItems>
         <artifactItem>
             <groupId>myGroup</groupId>
            <artifactId>myArtifact</artifactId>
            <version>1.0</version>
            <type>zip</type>
            <overWrite>true</overWrite>
            <outputDirectory>${project.build.directory}/webapp-downloads</outputDirectory>
        </artifactItem>
    </artifactItems>
    </configuration>
</execution>