Maven真的很灵活吗?

时间:2012-10-09 03:36:22

标签: maven

我理解Maven如何使用src / java / main中的.java文件。但是它可以用于更一般的情况吗?让我们把它说得更抽象:假设我已经有一些a.exe从目录A1,A2,A3中读取一些(不一定只是.java)源,并将一些文件(可能是一些生成.java)放到目录B1,B2中。我还有一些b.exe当前从B1,B2,B3读取文件并生成其他内容。一些更类似的步骤。 (现实生活中存在的问题)。

我想写一个POM.xml文件,以便maven可以完成这项工作。那可能吗?我假设a.exe和b.exe应该作为maven插件扭曲。 接下来,在Maven文档中,我看到:

<build>
    <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
    <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
    <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
    <outputDirectory>${basedir}/target/classes</outputDirectory>
    <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
    ...
</build>

困扰我的是“sourceDirectory”本身就是一个硬编码名称。 Maven会接受A1和A2标签吗?

3 个答案:

答案 0 :(得分:1)

(您是否会考虑接受以前的一些问题,以便其他人更愿意回答您?)

Maven对Convention over Configuration的压力。您可以将sourceDirectory视为约定之一,我们已经预定了一些与(Java)编译器插件一起使用的元素。

您可以实现您想要做的事情。您可以自己编写一个插件/ MOJO,它可以从您想要的任何目录中读取并调用您想要的任何外部exe。通过在MOJO中使用合理的默认值,您可以使项目POM看起来像

<project>
  :
  :
  <build>
    <plugins>
      <plugin>
        <groupId>yourPluginGroup</group>
        <artifactId>generate-A-data</artifactId>
        <!-- if you want extra configuration, you can have <configuration> elements -->
      </plugin>

      <plugin>
        <groupId>yourPluginGroup</group>
        <artifactId>generate-B-data</artifactId>
      </plugin>
    </plugins>
  </build>
<project>

不是那么糟糕?

然而,说Maven是否“灵活”是值得怀疑的。我相信灵活性永远不是Maven的目标。 Maven专门用于构建,它定义了不同的骨架供你遵循(例如构建阶段,依赖范围),你永远不能像其他基于脚本的工具一样使用Maven“灵活”。

答案 1 :(得分:1)

答案是:不,这不是灵活的。这是一个简单的任务,即使在这个世界的所有maven论坛的帮助下我都无法解决:写一个POM

  1. 编译一些充满Java文件的目录
  2. 做其他事情(如果你愿意 - 执行一个示例Hello World Mojo插件)
  3. 使用其他一些Java文件编译其他目录。

     NO WAY !
    

答案 2 :(得分:0)

通过将exec插件和编译器插件绑定到“生成源”,您可以在不编写插件的情况下完成此操作。或者&#39;流程类&#39;阶段。构建帮助程序插件也可用于添加源路径。

对于原始案例,您可以尝试以下绑定:

  • build-helper-maven-plugin绑定到初始化阶段,添加任何必要的源目录(例如B1和B2)
  • exec-maven-plugin绑定到generate-sources阶段,有两个执行,一个用于a.exe,另一个用于b.exe

对于Hello World Mojo案例,如果将以下内容添加到流程类阶段(按顺序),该怎么办?

  • Hello World Mojo插件
  • 构建助手插件以添加源目录
  • 编译器插件

我能看到的唯一缺点是将重新编译第一个源目录。但编译器应该足够聪明,知道没有任何改变,以及它是否是一个问题取决于你为什么要这样做。在运行Hello World之前,为什么需要目录A中的类文件?也许您真正关注应该成为单独模块的两个独立代码片段?