maven-jar-plugin addClasspath作用域

时间:2010-08-12 10:39:29

标签: maven-2

在向jar清单添加类路径时,有没有让maven-jar-plugin使用范围?我有一个项目,我想创建2个罐子 - 运行时和测试。运行时jar应该只有运行时依赖项的类路径。测试jar应该具有测试依赖项的类路径。我一直无法弄清楚如何做到这一点。任何想法?

我知道MJAR-117,但是这个bug已经有一年多了 - 也许它已经在不同的JIRA中解决了?

3 个答案:

答案 0 :(得分:4)

我不认为Maven Archiver支持这一点(并且MJAR-117似乎没有太多牵引力)。可能的解决方法是在构建test-jar时提供(硬编码)其他类路径条目:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <version>2.2</version>
  <executions>
    <execution>
      <id>default-jar</id>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
          </manifest>
        </archive>
      </configuration>
    </execution>
    <execution>
      <id>default-test-jar</id>
      <phase>package</phase>
      <goals>
        <goal>test-jar</goal>
      </goals>
      <configuration>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
          </manifest>
          <manifestEntries>
            <Class-Path>foo-1.0.jar bar-2.1.jar</Class-Path>
          </manifestEntries>
        </archive>
      </configuration>
    </execution>
  </executions>
</plugin>

我同意这不太理想,你必须手动添加东西,这很容易出错。但它的确有效。

你可以用过滤和一些惊人的魔法来做一些更动态的事情,但这肯定需要更多的工作。

相关问题

答案 1 :(得分:0)

我不知道错误是否已修复。坦率地说,我甚至都不知道这个错误是否存在。但我认为您的问题可以使用maven profiles

解决

您可以为测试设置单独的配置文件:

<profile>
  <id>test</id>
  <activation>
    <property>
      <name>test</name>
      <value>true</value>
    </property>
  </activation>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8</version>
      <!-- 
        we don't need the test scope since we want the jar plugin to include
        it in classpath 
      -->
      <!-- scope>test</scope --> 
    </dependency>
  </dependencies>
</profile>

要使用此个人资料:

$>mvn -Dtest=true package

答案 2 :(得分:0)

我想在mvn的一次执行中创建app jar和测试jar。通过使用配置文件,我将不得不执行两次mvn。我需要执行mvn的原因是因为我想使用maven-assembly-plugin将这两个jar包装在一个zip文件中。

我进入了maven archiver(here)的源代码。看起来这是不可能的。我认为我能做到这一点的唯一方法是将所有测试依赖项的范围标记为“运行时”,并将这些jar部署到PROD,即使它们不会被使用。不漂亮。

196 if(config.isAddClasspath()) 197 { 198 StringBuffer classpath = new StringBuffer(); 199个
200 List artifacts = project.getRuntimeClasspathElements();

我还有另一个想法 - 这可以用maven groovy插件完成吗?