设计maven插件,从src / main / resources中的XML文件生成Java源代码

时间:2012-10-01 19:52:44

标签: maven code-generation classpath maven-plugin

我正在使用JCasGen的Maven插件,它接受XML类型系统描述文件并生成一些Java类。类型系统描述文件通常指向同一项目via the classpath中的其他类型系统描述文件。因此,JCasGen需要一个包含所有XML类型系统描述文件的类路径才能运行。 (这些XML文件也必须放在项目的最终jar文件中,因为Java代码也可以通过类路径引用它们。)

XML文件位于src/main/resources,以便Maven将它们复制到target/classes,它们将包含在项目的jar文件中。因此,赋予插件的自然类路径为target/classes。但是,如果我的插件在直观的generate-sources阶段运行,则src/main/resources中的XML文件尚未复制到target/classes,JCasGen将失败。

那么我如何构建事物以便为JCasGen提供正确的类路径?

以下是我想到的一些事情,但我不知道它们是否有意义:

  1. process-resources阶段运行插件,只需使用target/classes作为类路径。这就是我目前正在做的事情,似乎有效。 (我担心确保我的插件总是在标准Maven复制资源之后运行,但这似乎是默认情况下会发生的事情。)这种方法的主要问题是process-resources不是一个直观的阶段。生成源的插件。

  2. 通过连接资源目录和target/classes

    来构建类路径
    StringBuilder classpath = new StringBuilder();
    for (Resource resource : this.project.getBuild().getResources()) {
      classpath.append(resource.getDirectory());
      classpath.append(File.pathSeparatorChar);
    }
    classpath.append(this.project.getBuild().getOutputDirectory());
    

    我尝试了类似这样的东西,似乎有效,但我担心这可能会因包含或排除的复杂资源而失败。

3 个答案:

答案 0 :(得分:1)

我不完全理解您的问题,我将其添加为aswer以便能够正确格式化(所以请不要投票,除非它是实际使用的!)。

我知道你的插件应该在generate-sources阶段运行:它是正确的阶段,完全停止:)。

maven标准说生成的代码应该在target / generated-sources /下,例如jaxb2 plugin将文件放在target / generated-sources / jaxb下,maven会在编译期间自动添加该文件夹。

我建议你查看jaxb2插件以找到一些指导。

答案 1 :(得分:1)

创建一个多模块项目,其中第一个模块只是将xml文件复制到jar中。第二个模块使用该jar作为输入并执行插件。

.
├── pom.xml
├── xml
|   ├── pom.xml
|   └── src
|       └── main
|           └── resources
|               └── com
|                   └── stackoverflow
|                       ├── package1
|                       |   └── FirstClass.xml
|                       └── package2
|                           └── SecondClass.xml
└── gen
    └── pom.xml

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.stackoverflow</groupId>
    <artifactId>Q12682078</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>${project.artifactId}-${project.version}</name>

    <modules>
        <module>xml</module>
        <module>gen</module>
    </modules>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.stackoverflow</groupId>
                <artifactId>Q12682078-xml</artifactId>
                <version>${project.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

xml/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.stackoverflow</groupId>
        <artifactId>Q12682078</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>Q12682078-xml</artifactId>

    <name>${project.artifactId}-${project.version}</name>
</project>

gen/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.stackoverflow</groupId>
        <artifactId>Q12682078</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <artifactId>Q12682078-gen</artifactId>

    <name>${project.artifactId}-${project.version}</name>

    <dependencies>
        <dependency>
            <groupId>com.stackoverflow</groupId>
            <artifactId>Q12682078-xml</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <!-- your plugin that now has the xml files in the classpath -->
            </plugin>
        </plugins>
    </build>
</project>

答案 2 :(得分:0)

只需在process-resources阶段运行该插件即可。此解决方案由生成源并需要访问类路径的其他插件使用:

请注意,要获取类路径,您应该使用project.getCompileClasspathElements(),而不是project.getBuild().getOutputDirectory()。前者会确保你得到,例如当前项目所依赖的项目的target/classes目录。