27

我只想编译源目录中选定的文件或目录(包括子目录)。我很确定我可以使用<includes>ofmaven-compiler-plugin的配置来做到这一点,但它似乎不像我预期的那样工作,因为它仍然将所有类编译成target/classes. 真正奇怪的是,Maven 输出表明该设置确实有效,因为:

  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.5.1</version>
    <configuration>
      <includes>
        <include>com/example/dao/bean/*.java</include>
      </includes>
    </configuration>
  </plugin>

我有:

[INFO] Compiling 1 source file to c:\Projects\test\target\classes

但没有编译器的配置,我有:

[INFO] Compiling 14 source file to c:\Projects\test\target\classes

然而,在这两种情况下,所有 14 个类都被编译成target/classes我提到的。您能否解释一下或建议另一种仅编译选定文件的解决方案?

4

4 回答 4

36

具有 3 个类的简单应用程序。

com/company/Obj1.java
com/company/Obj2.java
com/company/inner/Obj3.java  

buildpom.xml

<build>
         <plugins>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>2.0.2</version>
               <configuration>
                  <source>1.6</source>
                  <target>1.6</target>
                  <includes>
                     <include>com/company/inner/*.java</include>
                  </includes>
               </configuration>
            </plugin>
          </plugins>

   </build>  

结果:编译了 1 个类。
并且包含的​​任何组合都运行良好
,或者您的意思是别的?

于 2012-06-18T10:47:27.020 回答
3

我也遇到过类似的情况。我们只需要将修改后的文件热交换到我们的远程 docker 容器中,以缩短更改部署时间。这就是我们解决它的方法。

在带有命令行参数的构建插件中添加包含选项。注意因为我们想添加多个文件,所以我们使用了包含而不是包含

         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <compilerVersion>1.8</compilerVersion>
                <source>1.8</source>
                <target>1.8</target>
                <includes>${changed.classes}</includes>
            </configuration>
        </plugin>

现在使用参数运行编译阶段,例如:

mvn compile -Dchanged.classes=com/demo/ClassA.java,com/demo/ClassB.java,com/demo2/*
于 2019-05-30T06:46:47.060 回答
2

maven-compiler-plugin 使用类似 Ant 的包含/排除表示法。您可以在 Ant 文档中查看示例Ant FileSet Type

如果您只想包含一个目录中的文件,则需要像以前那样编写它:

<include>com/example/dao/bean/*.java</include>

要包括路径中的子目录,它将是:

<include>com/example/dao/bean/**/*.java</include>
于 2012-06-21T11:14:12.810 回答
0

使用 maven 编译器插件包含或排除用于编译的文件没有任何困难2.5.1是我用于此目的的虚拟项目。也许include您使用的模式不同。

于 2012-06-19T05:10:11.850 回答