Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Maven中仅编译选定的文件_Java_Maven - Fatal编程技术网

Java 在Maven中仅编译选定的文件

Java 在Maven中仅编译选定的文件,java,maven,Java,Maven,我只想编译源目录中选定的文件或目录(包括子目录)。我很确定我可以使用maven编译器插件的配置来完成这项工作,但它似乎没有像我预期的那样工作,因为它仍然将所有类编译成目标/类。真正奇怪的是,Maven输出表明该设置实际起作用,因为: maven编译器插件 2.5.1 com/example/dao/bean/*.java 我有: [INFO] Compiling 1 source file to c:\Projects\test\target\classes 但是没有编译器的配置,我有:

我只想编译源目录中选定的文件或目录(包括子目录)。我很确定我可以使用
maven编译器插件的
配置来完成这项工作,但它似乎没有像我预期的那样工作,因为它仍然将所有类编译成
目标/类。真正奇怪的是,Maven输出表明该设置实际起作用,因为:


maven编译器插件
2.5.1
com/example/dao/bean/*.java
我有:

[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
。你能解释一下,或者建议另一种只编译选定文件的解决方案吗?

简单应用程序,包含3个类

com/company/Obj1.java
com/company/Obj2.java
com/company/inner/Obj3.java  
pom.xml中的
build

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

org.apache.maven.plugins
maven编译器插件
2.0.2
1.6
1.6
com/company/internal/*.java
结果:编译了1个类。
而且任何包含的组合都能很好地工作

或者你是说别的什么

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

maven编译器插件使用类似Ant的包含/排除符号。 您可以在Ant文档中看到示例

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

<include>com/example/dao/bean/*.java</include>
com/example/dao/bean/*.java
要包括path中的子目录,它将是:

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

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

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

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

您是否记得在测试前进行清洁?您是否尝试过排除*/之前?我猜默认情况下maven包含所有内容,您必须排除。您使用的IDE是否碰巧设置了“autobuild”选项(如Eclipse)?是的,我在编译之前进行了清理。是的,我试图排除
***.java
。我这次不使用IDE。只需要普通的
pom.xml
和控制台。您如何在控制台上执行Maven?你是简单地运行“mvn clean compile”还是其他什么?我的第一个问题是:为什么你喜欢在项目中只编译有限数量的类?听起来你必须创建多个模块而不是一个?天哪!作品但是使用2.0.2版本的编译器!版本2.5.1和2.3.2忽略包括和排除。好像我们在这里发现了一个虫子。很有趣。。。我上面写的在我的例子(我的模块)中是正确的,但是一般来说,像@Ilya的例子这样简单的项目,即使是新版本的
maven编译器插件
,也没有问题。在我的模块的
pom.xml
或家长的层次结构中似乎有一些东西(有一些)。我会尽力调查我的案子,找出问题的答案。如果Maven编译器确实存在问题,我将为他们创建JIRA票证。您可以运行
mvn help:effective pom
查看在构建项目时使用的最终配置。确定。这是我调查的结果。
maven编译器插件的2.1版之前的版本按预期工作-它通过其配置的
标记编译您想要的内容。版本2.2和更高版本有一些bug(我就是这么看的),它编译了您想要的东西,但也编译了源目录中成功编译所需的类。我接受这个@Ilya答案,并给出我的赏金,因为这个答案表明编译器版本在这里很重要。
mvn compile -Dchanged.classes=com/demo/ClassA.java,com/demo/ClassB.java,com/demo2/*