在WAR文件的lib目录中包含Source JAR(Web应用程序)

时间:2015-01-31 19:08:14

标签: java maven tomcat jar cobertura

我们正在使用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中包含lib JAR 1}} webapp本身的文件夹。

1 个答案:

答案 0 :(得分:2)

首先,您必须配置war项目描述符以包含Web应用程序的 来源 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>

此处的相关部分是<webResources>元素,它指示maven将其他资源包含在您的存档中,由以下内容确定:

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

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

使用 maven-sources-plugin 可以通过提及maven <phase>(其中将生成源代码)使用必要的技巧无缝完成必须来到阶段之前(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您可以找到一个可以复制/使用项目描述符配置的工作示例。