【问题标题】:Compiling only selected files in Maven在 Maven 中仅编译选定的文件
【发布时间】:2012-06-15 13:29:45
【问题描述】:

我只想编译源目录中选定的文件或目录(包括子目录)。我很确定我可以使用maven-compiler-plugin 的配置中的<includes> 来做到这一点,但它似乎不像我预期的那样工作,因为它仍然将所有类编译成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。您能否解释一下或建议另一种仅编译选定文件的解决方案?

【问题讨论】:

  • 您记得在测试之前进行清洁吗?
  • 你之前试过排除*/吗?我猜默认情况下,maven 包含所有内容,您必须排除。您是否正在使用带有“自动构建”选项的 IDE(例如 Eclipse)?
  • 是的,我在编译之前进行了清理。是的,我试图排除**/*.java。这次我不使用IDE。只是简单的pom.xml 和控制台。
  • 你是如何在控制台上执行 Maven 的?你只是简单地运行'mvn clean compile'还是别的什么?
  • 我的第一个问题是:为什么你喜欢在你的项目中只编译有限数量的类?听起来您必须创建多个模块而不是一个?

标签: java maven


【解决方案1】:

具有 3 个类的简单应用。

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

build in pom.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 个类。
并且包含的​​任何组合都运行良好
还是你的意思是别的?

【讨论】:

  • 天啊!作品!但是使用 2.0.2 版本的编译器!版本 2.5.1 和 2.3.2 忽略包含和排除。看来我们在这里发现了一个错误。
  • 有趣...我上面写的在我的案例(我的模块)中是正确的,但总的来说,像@Ilya 的示例这样简单的项目,即使使用新版本的@ 也没有问题987654325@。我的模块的pom.xml 或父母的层次结构中似乎有一些东西(有一些)。我将尝试调查我的案例并找出问题的答案。如果 Maven 编译器确实有问题,我会为他们创建 JIRA 票证。
  • 您可以运行mvn help:effective-pom 来查看构建项目时使用的最终配置。
  • 好的。这是我的调查结果。 maven-compiler-plugin 的最高 2.1 版本按预期工作 - 它通过其配置的 &lt;includes&gt;&lt;excludes&gt; 标记编译您想要的内容。 2.2 及更高版本有一些错误(这就是我的看法),它可以编译您想要的内容,但也有成功编译所需的源目录中的类。
  • 我接受这个@Ilya 的答案并给予我的赏金,因为它的答案表明编译器版本在这里很重要。
【解决方案2】:

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

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

         <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/*

【讨论】:

    【解决方案3】:

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

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2020-12-03
        • 2018-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 2011-05-10
        • 2022-10-02
        相关资源
        最近更新 更多