maven antrun插件从一个未知的子目录名复制文件
我正在尝试使用maven antrun插件从一个未知的子目录名复制文件,maven,ant,maven-antrun-plugin,Maven,Ant,Maven Antrun Plugin,我正在尝试使用maven-antrun插件将生成的.java文件复制到我当前的源目录。我的问题是生成了我要复制的路径目录的一部分 我要复制的路径如下所示: ${project.build.directory}/working/${project.artifactId}-${project.version}/ejbModule 从这一点开始,我想复制所有的.java文件及其子目录(以保持包的树) 请参阅我上面的插件配置: <plugin> <artifactId>m
maven-antrun插件
将生成的.java
文件复制到我当前的源目录。我的问题是生成了我要复制的路径目录的一部分
我要复制的路径如下所示:
${project.build.directory}/working/${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>
有什么想法吗?即时解决方案:将生成的目录名设置为属性:
<fileset dir="${project.build.directory}/working/${generated.dir}/${project.artifactId}-${project.version}/ejbModule">
<include name="**/*.java"/>
</fileset>
更新
如果生成的目录只有一个,您可以通过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="\1" />
</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>
将存根文件从${generated.dir}移动到源项目。
然后,就从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>
org.apache.maven.plugins
maven antrun插件
1.8
ejbdeploy拷贝
验证
跑
重要提示:尊重maven antrun插件的版本1.8。你的做法是错误的。你肯定不想将源文件复制到主源目录中。生成的文件永远不应该出现在
src/main/java
中。这是因为生成的代码不能进行版本控制;这些文件是e在构建过程中重新生成,因此应该始终位于Maven的构建目录中,默认情况下,该目录为target
要将这些文件添加为源,而不是将其复制到主源目录中,您可以使用目标。这将添加指定的文件夹作为源目录。在这种情况下,您可以使用它并引用包含源的生成文件夹
诀窍是你不知道文件夹的路径。要解决这个问题,你可以利用。有了这个插件,你可以迭代给定目录的所有子目录;当前目录可以通过变量@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>
com.soebes.maven.plugins
迭代器maven插件
0.4
生成源
迭代器
${project.build.directory}/working
org.codehaus.mojo
构建助手maven插件
1.12
添加源
${project.build.directory}/working/@item@/${project.artifactId}-${project.version}/ejbModule
在验证
阶段复制源文件的目的是什么?要小心,因为这是一个非常老的项目。问题是我需要启动ejbdeploy为远程EJB(2.1)生成一些存根为此,我需要在我刚刚在模块的包阶段创建的jar上启动ejbdeploy命令。之后,我只能复制所有生成的.java文件。我只是被迫在包一之后的阶段插入插件。这就是为什么。这不是一个解决方案,因为我事先不知道生成的控制器的名称y、 Tunaki的观点得到了很好的理解:将生成的文件复制到src
目录不是一个好的做法。因为在编译
阶段之前,您不知道生成的目录的名称,所以不可能添加源目录或资源目录,您应该将生成的文件复制到目标/类
目录中tead。这不是关于良好实践与否;我知道这是完全肮脏的,不应该做。这个项目已经有13年的历史了,到目前为止还没有Maven结构。一切都不能像我从一开始就做。无论如何,我选择放弃,因为Maven没有权利做任何事情来让RAD开心。我升级了我的vRAD的版本和所有东西现在都可以开箱即用。谢谢。我同意你的观点,但你的解决方案在这里对我不起作用。这是因为生成的源文件来自我刚构建的jar上启动的ejbdeploy命令。我被迫将它放在一个阶段后的包中。尽管如此,我还是要尝试你的解决方案。Eclipse成功了吗a随后将此文件夹添加到生成路径?@MadJlzz为什么要在包阶段添加源文件?当时,代码已经编译,因此不会考虑它们。生成源的ejbdeploy
可执行文件也应该在生成源
阶段启动。因为ejbdeploy可执行文件需要由我编译的源代码制成的jar来生成一个包含EJB远程存根的新jar。它们是用RMIC编译的,所以一切都很好。我正在尝试这样做,因为没有这些源文件,我无法正确使用我的应用程序。当我部署我的应用程序时,我需要将这些文件来源化,否则应用程序将无法正常工作全部。(我正在Websphere上使用RAD部署它。)这是因为RAD没有部署到我构建的最后一个耳朵,而是做了某种黑魔法来让事情有效。@ Majjrz我看到了。考虑制作一个多模块Maven项目,并有一个模块来封装运行<代码> EJBDebug 所需的jar。然后在另一个模块中,你可以依靠第一个模块,执行< c。ode>ejbdeploy在“生成源”阶段,并添加创建的源
<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>
<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>