我正在使用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提供正确的类路径?
以下是我想到的一些事情,但我不知道它们是否有意义:
在process-resources
阶段运行插件,只需使用target/classes
作为类路径。这就是我目前正在做的事情,似乎有效。 (我担心确保我的插件总是在标准Maven复制资源之后运行,但这似乎是默认情况下会发生的事情。)这种方法的主要问题是process-resources
不是一个直观的阶段。生成源的插件。
通过连接资源目录和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());
我尝试了类似这样的东西,似乎有效,但我担心这可能会因包含或排除的复杂资源而失败。
答案 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
目录。