【问题标题】:Building a WAR project with unzipped JAR dependency?使用解压缩的 JAR 依赖项构建 WAR 项目?
【发布时间】:2010-11-24 23:34:17
【问题描述】:

我有两个项目,my-libmy-webapp。第一个项目是my-webapp 的依赖项。因此,当要求 Maven2 构建我的 WAR 时,my-lib JAR 被添加到 Web 应用程序的 WEB-INF/lib/ 目录中。

但是,我希望将my-lib JAR 直接解压缩到WEB-INF/classes 目录中,就像my-lib 源包含在项目my-webapp 中一样。

换句话说,而不是具有以下 WAR 内容:

my-webapp/
  ...
  WEB-INF/
    lib/
      my-lib-1.0.jar
      ... (others third libraries)

我想要那个:

my-webapp/
  ...
  WEB-INF/
    classes/
      my-lib files
    lib/
      ... (others third libraries)

有没有办法配置 my-webapp 或 Maven2 战争插件来实现这一点?

【问题讨论】:

    标签: maven-2 build-process


    【解决方案1】:

    正如 blaufish 的回答所说,您可以使用 maven-dependency-plugin 的 unpack mojo 解压缩工件。但是为了避免 jar 出现在 WEB-INF/lib 中,您需要不将其指定为依赖项,而是将插件配置为 unpack specific artifacts

    以下配置将在 process-resources 阶段将 some.group.id:my-lib:1.0:jar 的内容解包到 target/classes 中,即使工件未定义为依赖项。这样做时要小心,因为可能会破坏您的实际内容,这可能会导致大量调试。

    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>unpack-my-lib</id>
          <phase>process-resources</phase>
          <goals>
            <goal>unpack</goal>
          </goals>
          <configuration>
            <artifactItems>
              <artifactItem>
                <groupId>some.group.id</groupId>
                <artifactId>my-lib</artifactId>
                <version>1.0</version>
                <type>jar</type>
                <overWrite>false</overWrite>
              </artifactItem>
            </artifactItems>
            <outputDirectory>${project.build.outputDirectory}</outputDirectory>
            <overWriteReleases>false</overWriteReleases>
          </configuration>
        </execution>
      </executions>
    </plugin>
    

    【讨论】:

    • 另外最好在provided范围内的常规依赖项中添加my-lib;如果你的战争有针对这个编译的类,这是必须的。并且,从 artifactItem 中删除版本,因为它将从依赖项中获取。
    • 将 my-lib 范围设置为提供不包括使用 maven 3.0.4 的传递 deps。现在的问题是如何使用 my-lib 进行编译,同时只将提取的内容和传递依赖项添加到战争中。
    【解决方案2】:

    您可以配置 maven-dependency-plugin 来执行此操作,解压缩而不是复制 jar,如 here 所述。

    <project>
    [...]
    <build>
     <plugins>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
         <version>2.5.1</version>
         <executions>
           <execution>
             <id>unpack</id>
             <phase>package</phase>
             <goals>
               <goal>unpack</goal>
             </goals>
             <configuration>
               <artifactItems>
                 <artifactItem>
                   <groupId>junit</groupId>
                   <artifactId>junit</artifactId>
                   <version>3.8.1</version>
                   <type>jar</type>
                   <overWrite>false</overWrite>
                   <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
                   <destFileName>optional-new-name.jar</destFileName>
                   <includes>**/*.class,**/*.xml</includes>
                   <excludes>**/*test.class</excludes>
                 </artifactItem>
               </artifactItems>
               <includes>**/*.java</includes>
               <excludes>**/*.properties</excludes>
                     <outputDirectory>${project.build.directory}/wars</outputDirectory>
               <overWriteReleases>false</overWriteReleases>
               <overWriteSnapshots>true</overWriteSnapshots>
             </configuration>
           </execution>
         </executions>
       </plugin>
     </plugins>
    </build>
    [...]
    </project>
    

    【讨论】:

      【解决方案3】:

      unpack mojo 似乎接近您的目标。不确定如何完成您提出的整个流程。

      (顺便说一句,我怀疑这是否是个好主意。实用程序类应该放入罐子中,并且罐子放在 WAR 或 IO EAR 中。解压实用程序罐子似乎是错误的)

      【讨论】:

      • 关于您的评论:我只想解压 my 库,而不是其他库。我想这样做是因为属性文件可能会被修改。目前,这些文件存储在 my-lib.JAR 文件中,如果要修改其中一个文件,则需要解压 JAR,修改文件,然后重新打包 JAR...
      • 你不能在修改文件时在类目录中打一个补丁吗?
      • 使用这个插件,我成功解压了WEB-INF/classes目录下的JAR。但是,我在 WEB-INF/lib/ 目录中也有 my-lib.JAR...
      【解决方案4】:

      如上所述,我能够使用解包 mojo,另外我将依赖项本身标记为 "provided" (scope) 以避免重复 WEB-INF/lib 下的 jar 内容。

      【讨论】:

        【解决方案5】:

        [糟糕,刚刚意识到您使用的是 Maven。我不会删除这个答案,因为它可能会拯救一些 Ant 用户。所以没有必要对我进行改装...]

        我不得不提到多少次JarWarEar Ant 任务是Zip 的子任务? :-) 如果我没记错的话,这样的事情就可以了:

        <war dist="my-webapp.war">
            <zipgroupfileset dir="libs" includes="*.jar" prefix="WEB-INF/classes"/>
        </war>
        

        src="mylib.jar" 也值得一试,但我还没有测试过这个选项。

        【讨论】:

          猜你喜欢
          • 2012-05-10
          • 1970-01-01
          • 2014-10-06
          • 2013-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-30
          相关资源
          最近更新 更多