maven-antrun-plugin 从一个未知的子目录名称复制文件
maven-antrun-plugin copy files from one unknown subdirectory name
我正在尝试使用 maven-antrun-plugin
将生成的 .java
文件复制到我当前的源目录。我的问题是生成了我要复制的路径目录的一部分。
我要复制的路径是这样的:
${project.build.directory}/working/<GENERATED_DIRECTORY_I_DONT_KNOW_THE_NAME>/${project.artifactId}-${project.version}/ejbModule
从这一点开始,我想复制所有 .java 文件及其子目录(以保留包的树。
看我上面的插件配置:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ejbdeploy-copy</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Moving stubs file to source project.</echo>
<copy todir="${project.build.sourceDirectory}">
<fileset dir="${project.build.directory}/working/**/${project.artifactId}-${project.version}/ejbModule">
<include name="**/*.java"/>
</fileset>
</copy>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
问题是 maven-antrun-plugin 无法将我的 **
转换为生成的目录名称。
我试过这种配置,但没有成功:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ejbdeploy-copy</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Moving stubs file to source project.</echo>
<copy todir="${project.build.sourceDirectory}">
<fileset dir="${project.build.directory}">
<include name="**/*.java"/>
<exclude name="**/ejbModule/"/>
</fileset>
</copy>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
有什么想法吗?
即时解决方案:将生成的目录名称设置为属性:
<fileset dir="${project.build.directory}/working/${generated.dir}/${project.artifactId}-${project.version}/ejbModule">
<include name="**/*.java"/>
</fileset>
变量可以在 pom 的 properties
部分声明,或者在本地 settings.xml
文件的某些配置文件中声明,或者直接从命令行接收:
mvn -Dgenerated.dir=c:\generated clean install
更新
如果生成的目录只有一个,在Ant中用一个简单的程序就可以得到它的名字。我建议你把所有的 ant 东西放到一个 build.xml
文件中:
<project basedir=".">
<dirset id="dirs" dir="${project.build.directory}/working" includes="*" />
<pathconvert pathsep="${line.separator}" property="generated.dir" refid="dirs">
<chainedmapper>
<mapper type="flatten" />
<regexpmapper from="(.*)" to="" />
</chainedmapper>
</pathconvert>
<echo>Moving stubs file from ${generated.dir} to source project.</echo>
<copy todir="${project.build.sourceDirectory}">
<fileset dir="${project.build.directory}/working/${generated.dir}/${project.artifactId}-${project.version}/ejbModule">
<include name="**/*.java" />
</fileset>
</copy>
</project>
然后,它只是从 pom 中调用它:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>ejbdeploy-copy</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<ant antfile="build.xml">
</ant>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
重要提示:尊重 1.8 版 maven-antrun-plugin。
你走错了路。您绝对不想将源文件复制到主源目录中。生成的文件永远不应以 src/main/java
结尾。这是因为生成的代码不能受版本控制;这些是在构建过程中重新生成的文件,因此应该始终位于 Maven 的构建目录中,默认情况下为 target
。
要将这些文件添加为源,而不是将它们复制到主源目录,您可以使用 build-helper-maven-plugin:add-source
目标。这将添加一个指定的文件夹作为源目录。在这种情况下,您可以使用它并引用生成的包含您的源的文件夹。
诀窍是您不知道文件夹的路径。要解决这个问题,您可以使用 iterator-maven-plugin
。使用此插件,您可以遍历给定目录的所有子目录;当前目录可以通过变量@item@
获取。这样,关于目录名称的配置是动态的。
<plugin>
<groupId>com.soebes.maven.plugins</groupId>
<artifactId>iterator-maven-plugin</artifactId>
<version>0.4</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>iterator</goal>
</goals>
<configuration>
<folder>${project.build.directory}/working</folder>
<pluginExecutors>
<pluginExecutor>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
</plugin>
<goal>add-source</goal>
<configuration>
<sources>
<source>${project.build.directory}/working/@item@/${project.artifactId}-${project.version}/ejbModule</source>
</sources>
</configuration>
</pluginExecutor>
</pluginExecutors>
</configuration>
</execution>
</executions>
</plugin>
我正在尝试使用 maven-antrun-plugin
将生成的 .java
文件复制到我当前的源目录。我的问题是生成了我要复制的路径目录的一部分。
我要复制的路径是这样的:
${project.build.directory}/working/<GENERATED_DIRECTORY_I_DONT_KNOW_THE_NAME>/${project.artifactId}-${project.version}/ejbModule
从这一点开始,我想复制所有 .java 文件及其子目录(以保留包的树。
看我上面的插件配置:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ejbdeploy-copy</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Moving stubs file to source project.</echo>
<copy todir="${project.build.sourceDirectory}">
<fileset dir="${project.build.directory}/working/**/${project.artifactId}-${project.version}/ejbModule">
<include name="**/*.java"/>
</fileset>
</copy>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
问题是 maven-antrun-plugin 无法将我的 **
转换为生成的目录名称。
我试过这种配置,但没有成功:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>ejbdeploy-copy</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<echo>Moving stubs file to source project.</echo>
<copy todir="${project.build.sourceDirectory}">
<fileset dir="${project.build.directory}">
<include name="**/*.java"/>
<exclude name="**/ejbModule/"/>
</fileset>
</copy>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
有什么想法吗?
即时解决方案:将生成的目录名称设置为属性:
<fileset dir="${project.build.directory}/working/${generated.dir}/${project.artifactId}-${project.version}/ejbModule">
<include name="**/*.java"/>
</fileset>
变量可以在 pom 的 properties
部分声明,或者在本地 settings.xml
文件的某些配置文件中声明,或者直接从命令行接收:
mvn -Dgenerated.dir=c:\generated clean install
更新
如果生成的目录只有一个,在Ant中用一个简单的程序就可以得到它的名字。我建议你把所有的 ant 东西放到一个 build.xml
文件中:
<project basedir=".">
<dirset id="dirs" dir="${project.build.directory}/working" includes="*" />
<pathconvert pathsep="${line.separator}" property="generated.dir" refid="dirs">
<chainedmapper>
<mapper type="flatten" />
<regexpmapper from="(.*)" to="" />
</chainedmapper>
</pathconvert>
<echo>Moving stubs file from ${generated.dir} to source project.</echo>
<copy todir="${project.build.sourceDirectory}">
<fileset dir="${project.build.directory}/working/${generated.dir}/${project.artifactId}-${project.version}/ejbModule">
<include name="**/*.java" />
</fileset>
</copy>
</project>
然后,它只是从 pom 中调用它:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<id>ejbdeploy-copy</id>
<phase>verify</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<ant antfile="build.xml">
</ant>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
重要提示:尊重 1.8 版 maven-antrun-plugin。
你走错了路。您绝对不想将源文件复制到主源目录中。生成的文件永远不应以 src/main/java
结尾。这是因为生成的代码不能受版本控制;这些是在构建过程中重新生成的文件,因此应该始终位于 Maven 的构建目录中,默认情况下为 target
。
要将这些文件添加为源,而不是将它们复制到主源目录,您可以使用 build-helper-maven-plugin:add-source
目标。这将添加一个指定的文件夹作为源目录。在这种情况下,您可以使用它并引用生成的包含您的源的文件夹。
诀窍是您不知道文件夹的路径。要解决这个问题,您可以使用 iterator-maven-plugin
。使用此插件,您可以遍历给定目录的所有子目录;当前目录可以通过变量@item@
获取。这样,关于目录名称的配置是动态的。
<plugin>
<groupId>com.soebes.maven.plugins</groupId>
<artifactId>iterator-maven-plugin</artifactId>
<version>0.4</version>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>iterator</goal>
</goals>
<configuration>
<folder>${project.build.directory}/working</folder>
<pluginExecutors>
<pluginExecutor>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<version>1.12</version>
</plugin>
<goal>add-source</goal>
<configuration>
<sources>
<source>${project.build.directory}/working/@item@/${project.artifactId}-${project.version}/ejbModule</source>
</sources>
</configuration>
</pluginExecutor>
</pluginExecutors>
</configuration>
</execution>
</executions>
</plugin>