【问题标题】:Adding java source (.java files) to test jar in Maven在 Maven 中添加 java 源(.java 文件)以测试 jar
【发布时间】:2010-05-26 19:26:30
【问题描述】:

我正在使用我的 pom.xml,并且能够为 src/main/java(比如 app.jar)以及 src/test/java(比如 app-test.jar)生成 jar .我还能够将我的 java 源代码作为 app.jar 的一部分包含在内(即,我的 .class 和 .java 文件都在 jar 中)。

但是对于我的 app-test.jar,我无法在其中包含我的 .java 文件。

这是我的 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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mycompany.app</groupId>
  <artifactId>my-app</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>my-app</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
      </resource>     
    </resources>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.3.1</version>
       <executions>
         <execution>
           <phase>package</phase> 
           <goals>           
             <goal>test-jar</goal>
           </goals>
           <configuration>
            <includes>
                <include>src/test/java</include>
            </includes>
           </configuration>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>

</project>

任何帮助将不胜感激。

谢谢。

关于 Whaley 建议的帖子更新:

尝试了 maven-antrun-plugin,但现在运行 mvn 包 之后,我在我的 tests.jar 中得到的只是 META-INF 文件夹。 .java 和 .class 不包括在内:

这是 pom.xml 的一部分

<build>
    <resources>
      <resource>
        <directory>src/main/java</directory>
      </resource>     
    </resources>
    <plugins>
      <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <executions>
         <execution>
           <phase>package</phase> 
           <goals>           
             <goal>test-jar</goal>
           </goals>
           <configuration>
            <includes>
                <include>src/test/java</include>
            </includes>
           </configuration>
         </execution>
       </executions>
     </plugin>
     <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
         <executions>
           <execution>
             <id>${project.artifactId}-include-sources</id>
             <phase>process-resources</phase>
             <goals>
               <goal>run</goal>
             </goals>
             <configuration>
               <tasks>
                 <copy todir="${project.build.testOutputDirectory}">
                   <fileset dir="${project.build.testSourceDirectory}"/>
                 </copy>
               </tasks>
             </configuration>
          </execution>
         </executions>
      </plugin>
    </plugins>
  </build>

谢谢。

【问题讨论】:

  • 请问您为什么需要这个,因为可能有更好的解决方案。
  • 只是我们需要访问这个jar文件并利用反射来首先获取一个类文件。一旦我们掌握了这一点,我们就想读取它的 java 文件并执行一些操作。我相信 maven 也会让我们能够包含测试 jar 的 java 源代码。

标签: maven


【解决方案1】:

我认为您可能需要使用程序集插件生成自定义程序集:

http://maven.apache.org/plugins/maven-assembly-plugin/single-mojo.html

但更简洁的解决方案是使用源插件单独打包测试源

http://maven.apache.org/plugins/maven-source-plugin/test-jar-mojo.html

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-source-plugin</artifactId>
    <version>2.1.2</version>
    <executions>
      <execution>
        <id>attach-test-sources</id>
        <goals>
          <goal>test-jar-no-fork</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

然后,您可以在类路径中同时拥有测试源 jar 和测试类 jar,并执行以下操作:

YourClassName.class.getResource("YourClassName.java");

或更笼统地说:

public static InputStream getSourceForClass(final Class<?> clazz) {
    final String baseName = clazz.getSimpleName();
    return clazz.getResourceAsStream(baseName + ".java");
}

访问源代码

【讨论】:

【解决方案2】:

jar 插件的 includes 属性只允许包含来自插件 classesDirectory 属性的相对路径的文件。因此,除非您以某种方式将 .java 文件复制到 ${project.build.outputDirectory},否则这是行不通的。你可以用 maven-antrun-plugin 做类似的事情:

<build>
        <plugins>
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <id>${project.artifactId}-include-sources</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>run</goal>
                        </goals>
                        <configuration>
                            <tasks>
                                <copy todir="${project.build.outputDirectory}">
                                    <fileset dir="${project.build.SourceDirectory}"/>
                                </copy>
                            </tasks>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

【讨论】:

  • 您好试过了。但是 jar 文件包只包含 META-INF 文件夹。 .java 和 .class 文件不会捆绑在 jar 中。尝试使用 mvn 包。使用更新的 pom.xml 编辑了我的原始帖子。
  • 从 jar 插件中删除 (或完全删除 .jar 插件并尝试一下)。我在本地进行的测试没有在 pom.jar 中明确定义 jar 插件。让我知道结果。
  • 现在可以使用了。我删除了 并且它还捆绑了 .java。我试图删除 jar 插件,但从未为我创建测试 jar。所以我想我们需要覆盖 jar 插件配置来添加 test-jar 目标。感谢您的帮助。
  • 您可以通过接受答案和/或投票来表示感谢(对其他回答过您其他问题的人也可以这样做)。
  • 这是我尝试 Whaely 的第一件事。但它说投票需要 15 声望。现在对我来说它只显示 7 :(
猜你喜欢
  • 2023-04-03
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2019-01-22
  • 2019-10-16
  • 2023-02-09
  • 2017-05-27
  • 2015-03-30
相关资源
最近更新 更多