0

私はJCasGen用のMavenプラグインに取り組んでいます。このプラグインは、XML型のシステム記述ファイルを受け取り、いくつかのJavaクラスを生成します。型システム記述ファイルは、多くの場合、クラスパスを介して同じプロジェクト内の他の型システム記述ファイルを指します。したがって、JCasGenを実行するには、すべてのXML型システム記述ファイルを含むクラスパスが必要です。(これらのXMLファイルは、Javaコードもクラスパスを介して参照する可能性があるため、プロジェクトの最終的なjarファイルにも配置する必要があります。)

XMLファイルは、src/main/resourcesMavenがそれらをコピーし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にコピーするだけのマルチモジュールプロジェクトを作成します。2番目のモジュールは、そのjarを入力として使用し、プラグインを実行します。

。
├──pom.xml
├──xml
| ├──pom.xml
| └──src
| └──メイン
| └──リソース
| └──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>
于 2012-10-02T13:55:24.490 に答える
1

私はあなたの質問を完全には理解していません、そして私はそれを適切にフォーマットすることができるようにこれをaswerとして追加しています(それでそれが実際に使用されない限り投票しないでください!)。

プラグインはソースの生成フェーズで実行する必要があることを私は知っています。これは正しいフェーズであり、完全に停止します:)。

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 に答える