【问题标题】:Include Source JAR (of web application) in lib directory of WAR file在 WAR 文件的 lib 目录中包含 Source JAR(Web 应用程序)
【发布时间】:2015-01-31 19:08:14
【问题描述】:

我们正在使用 Cobertura 为我们部署的 Web 应用程序生成测试覆盖率。它需要在应用程序的类路径中找到源 JAR 以生成我们的 HTML 报告。

我们的 Maven 构建产生:

target/our-webapp-sources.jar (about 40k)
target/our-webapp.war (about 20MB)

当部署在 Tomcat 中时,我们有(在WEB-INF 下)

classes/... (the .class files) ...
lib/our-service-library.jar
lib/our-service-library-sources.jar
lib/our-core-library.jar
lib/our-core-library-sources.jar

所以我们能够检测,但只显示我们分析的ServiceCore 项目的源文件。我们想要将我们的-sources JAR 用于将webapp 本身作为依赖项部署在lib 目录下。所以我们想要:

classes/... (the .class files) ...
lib/our-webapp-sources.jar
lib/our-service-library.jar
lib/our-service-library-sources.jar
...

我们可以手动指定(对 Cobertura 命令行脚本)一个目录来查找源文件(认为我们可以单独为其提供源 JAR),但这样做会覆盖其他源.所以我们可以获取包含的 Web 服务源,但是这样做时,我们会丢失 CoreService 的源文件。

我们正在使用 Maven 配置文件 - 因此这将只是一个特定于仪器的部署,但我们希望调整 maven-war-plugin 或类似内容以将 -sources JAR 包含在 webapp 的 lib 文件夹中自己。

【问题讨论】:

    标签: java maven tomcat jar cobertura


    【解决方案1】:

    首先您必须配置您的war 项目描述符以包含您的Web 应用程序的sources jar,它可以简单地制作如下:

    <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>
    
      <!-- other components configuration -->
    
      <build>
        <finalName>war-with-sources</finalName>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <executions>
              <execution>
                <id>package-and-attach-sources</id>
                <phase>package</phase>
              </execution>
            </executions>
            <configuration>
              <webResources>
                <resource>
                  <directory>${project.build.directory}</directory>
                  <includes>
                    <include>${project.build.finalName}-sources.jar</include>
                  </includes>
                  <targetPath>WEB-INF/lib</targetPath>
                </resource>
              </webResources>
            </configuration>
          </plugin>
        </plugins>
      </build>
    </project>
    

    这里的相关部分是 &lt;webResources&gt; 元素,它指示 maven 在您的存档中包含其他资源,具体取决于:

    • directory 包括要添加的存档,它应该是您的构建目录,因为构建 *-sources.jar 文件将放在那里。
    • includes 指定要包含的工件的元素,即源 jar 假设这里它只是您的 Web 存档名称附加 sources 后缀(默认名称模式)。
    • targePath 定义了 war 存档中的目标,其中配置的包含将被复制。

    要使用上述配置复制源 jar 文件,您必须告诉 maven 生成默认情况下不生成的项目源。

    这可以使用 maven-sources-plugin 无缝完成,使用必要的技巧,通过提及 maven &lt;phase&gt;(将在其中生成源)必须 在 package 阶段(maven-war-plugin 的默认阶段)之前出现,例如prepare-package 阶段,否则您将无法将这些源代码包含在您的 war 文件中。下面是附加的 maven-sources-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/maven-v4_0_0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <build>
        <finalName>war-with-sources</finalName>
        <plugins>
          <!-- other plugins configuration -->
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
            <executions>
              <execution>
                <id>attach-sources</id>
                <phase>prepare-package</phase>
                <goals>
                  <goal>jar</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
        </plugins>
      </build>
    </project>
    

    Here您可以找到一个工作示例,您可以从中复制/使用项目描述符配置。

    【讨论】:

      猜你喜欢
      • 2019-10-04
      • 2016-02-21
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多