0

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

XML 文件在其中,src/main/resources以便 Maven 将它们复制到其中,target/classes并且它们将包含在项目的 jar 文件中。所以给插件的自然类路径是target/classes. 但是,如果我的插件在直观generate-sources阶段运行,则其中的 XML 文件src/main/resources还没有被复制到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());
    

    我尝试了类似的方法,它似乎可以工作,但我担心对于包含或排除的复杂资源,这可能会失败。

4

3 回答 3

1

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

.
├── pom.xml
├── xml
| ├── pom.xml
| └── 源
| └── 主要
| └── 资源
| └── com
| └── 堆栈溢出
| ├── 包1
| | └── FirstClass.xml
| └── 包2
| └── SecondClass.xml
└── 创
    └── 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>
于 2012-10-02T13:55:24.490 回答
1

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

我知道您的插件应该在生成源阶段运行:这是正确的阶段,句号:)。

maven 标准规定生成的代码应该放在 target/generated-sources/ 下,例如jaxb2 插件将文件放在 target/generated-sources/jaxb 下,maven 在编译过程中会自动添加这个文件夹。

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

于 2012-10-01T20:08:22.123 回答
0

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

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

于 2012-10-22T23:38:33.280 回答