2

私はJavaEE、mavenアプリケーションを持っています。このアプリケーションでは、XSD から生成されたクラスと、Mapstruct を介したマッパーを使用します。

私の EJB モジュールでは、maven ビルドは次のことを行う必要があります。

  1. jaxb2-maven-pluginで XSD から Java クラスを生成する
  2. これらの生成されたクラスをbuild-helper-maven-pluginによってソース フォルダーに追加します 。
  3. maven-processor-pluginは、これらの XSD 生成クラスを使用するgenerate -mapstruct-mappersによってMapstructマッパー実装を生成します
  4. 最後に、これらのマッパー実装もソースフォルダーに追加します

残念ながら、それは私にはうまくいきません。これは、ejb の pom.xml のプラグイン部分です。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>${version.jaxb2-maven-plugin}</version>
    <executions>
        <execution>
            <id>xjc</id>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
        <packageName>com.my.project</packageName>
        <catalog>src/main/resources/xsd/CustomCatalog.xml</catalog>
        <xjbSources>
            <xjbSource>${project.basedir}/src/main/resources/jaxb2/</xjbSource>
        </xjbSources>
        <sources>
           <source>${project.basedir}/src/main/resources/xsd/applications/MyNewClass.xsd</source>
       </sources>
       <xsdPathWithinArtifact>my/source/xsds</xsdPathWithinArtifact>
    </configuration>
</plugin>
<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <configuration>
        <defaultOutputDirectory>
            ${project.build.directory}/generated-sources
        </defaultOutputDirectory>
    </configuration>
    <executions>
        <execution>
            <id>generate-mapstruct-mappers</id>
            <phase>compile</phase>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <processors>
                    <processor>org.mapstruct.ap.MappingProcessor</processor>
                </processors>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>${version.mapstruct}</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>${version.mapstruct}</version>
        </dependency>
    </dependencies>
</plugin>
<!-- attach sources -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>compile</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.build.directory}/generated-sources</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

これにより、JAXB からクラスが生成され、JAR ファイルのソースに配置されます。しかし、生成された Mapper の実装はソースに含まれていません。

Eclipse では、生成されたクラスをビルド パスの一部として設定できますが、生成された JAR には mapperimplementations が含まれていません。

プラグインのフェーズを変更すると、maven-processor-plugin はシンボルが見つからないエラーをスローし、シンボルは jaxb から生成されたクラスです。

私を助けてくれてありがとう。

4

1 に答える 1

4

私の理解によると、望ましいフローは次のようになります。

  • XSD からクラスを生成する
  • それらをソースとして追加します (Builder ヘルパー経由)
  • MapStruct からマッパーを生成します (XSD からのクラスが必要です)。
  • それらをソースとして追加します (Builder ヘルパー経由)
  • すべてコンパイル

したがって、次のことを試みることができます。

  • jaxb2-maven-plugin の実行をフェーズ generate-sources に設定します
  • build-helper-maven-plugin の最初の実行をフェーズ生成ソースに設定します (XSD からのクラスをソースとして追加する必要があります)。
  • マッパー生成の実行をフェーズ プロセス ソース (ソースとして XSD クラスを検出する必要があります) に設定しますが、build-helper-maven-plugin エントリの後に宣言します。
  • build-helper-maven-plugin の 2 回目の実行をフェーズ プロセス ソースに設定します。これにより、マッパーがソースとして追加されます。

より明確にするために、2 つの異なる生成されたソースに対して、2 つの異なるフェーズで build-helper-maven-plugin を 2 回実行します。また、生成されたソースごとに 2 つの異なるフォルダー (つまりgenerate-sources-xsdgenerated-sources-mappers) を指定することをお勧めします。pom では、jaxb2 プラグイン、マッパー プラグイン、ビルド ヘルパー プラグインの宣言順序に従います。

以下に考えられる例を示します。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.1</version>
    <executions>
        <execution>
            <id>xjc</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <outputDirectory>${project.build.directory}/generated-sources-xsd</outputDirectory>
        <packageName>com.my.project</packageName>
        <catalog>src/main/resources/xsd/CustomCatalog.xml</catalog>
        <xjbSources>
            <xjbSource>${project.basedir}/src/main/resources/jaxb2/</xjbSource>
        </xjbSources>
        <sources>
            <source>${project.basedir}/src/main/resources/xsd/applications/MyNewClass.xsd</source>
        </sources>
        <xsdPathWithinArtifact>my/source/xsds</xsdPathWithinArtifact>
    </configuration>
</plugin>
<plugin>
    <groupId>org.bsc.maven</groupId>
    <artifactId>maven-processor-plugin</artifactId>
    <version>2.2.4</version>
    <configuration>
        <defaultOutputDirectory>
            ${project.build.directory}/generated-sources-mappers
        </defaultOutputDirectory>
    </configuration>
    <executions>
        <execution>
            <id>generate-mapstruct-mappers</id>
            <phase>process-sources</phase>
            <goals>
                <goal>process</goal>
            </goals>
            <configuration>
                <processors>
                    <processor>org.mapstruct.ap.MappingProcessor</processor>
                </processors>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct</artifactId>
            <version>1.0.0.Final</version>
        </dependency>
    </dependencies>
</plugin>
<!-- attach sources -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <version>1.9</version>
    <executions>
        <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.build.directory}/generated-sources-xsd</source>
                </sources>
            </configuration>
        </execution>
        <execution>
            <id>add-source2</id>
            <phase>process-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${project.build.directory}/generated-sources-mappers</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

注: 上記のスニペットでは、機能させるためにいくつかのバージョンを追加する必要がありました。

Maven ライフサイクル フェーズの完全なリストについては、こちらを参照してください。

于 2015-12-04T21:16:05.127 に答える