2

Java5またはJava6のいずれかをターゲットにできるモジュールを含むマルチモジュールビルドがあります。モジュールがJava6にオプトインできるようにし、デフォルトを5のままにします。

Java 5をターゲットとして設定するには、以下を構成する必要があります。

  • maven-compiler-plugin:ソースとターゲットを1.5に設定
  • maven-bundle-plugin:Bundle-RuntimeExecutionEnvironmentをJ2SE-1.5に構成します

Java 6をターゲットとして設定するには、以下を構成する必要があります。

  • maven-compiler-plugin:ソースとターゲットを1.6に設定
  • maven-bundle-plugin:Bundle-RuntimeExecutionEnvironmentをJavaSE-1.6に構成します

私は2つのプロパティを持つことを検討しました:java.compiler.sourceそしてosgi.breeそれは各モジュールによって定義することができますが、これはエラーの余地を残します。

モジュールごとにこれら2つのプラグインの構成を1つのスイッチでオーバーライドするにはどうすればよいですか?

4

3 に答える 3

3

Java 5モジュールが1つの親POMから派生し、Java6モジュールが別の親POMから派生するようにプロジェクトを個人的に構成します。

Global Parent (majority of global settings)
  Java5 parent (just define source/bundle)
    module A
    module B
  Java 6 parent (just define source/bundle)
    module C
于 2012-10-12T08:55:00.623 に答える
2

子モジュールがmy.java.versionプロパティ(または名前を付けたいもの)を設定できるようにし、コンパイラとバンドルプラグインのバージョンプロパティを設定するGroovyスクリプトを埋め込むのはどうですか?親pomでこのようなもの:

<project ...>
    ...
    <properties>
        <my.java.version>1.5</my.java.version>     <!-- default Java version -->
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.groovy.maven</groupId>
                <artifactId>gmaven-plugin</artifactId>
                <version>1.0</version>
                <executions>
                    <execution>
                        <!-- set up properties in an early lifecycle phase -->
                        <phase>initialize</phase>
                        <goals>
                            <goal>execute</goal>
                        </goals>
                        <configuration>
                            <!-- this can be as simple or complex as you need it to be -->
                            <source>
                                if (project.properties['my.java.version'] == '1.6') {
                                    project.properties['my.compiler.version'] = '1.6'
                                    project.properties['my.execution.environment.version'] = 'JavaSE-1.6'
                                }
                                else {
                                    project.properties['my.compiler.version'] = '1.5'
                                    project.properties['my.execution.environment.version'] = 'J2SE-1.5'
                                }
                            </source>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <!-- now use the properties from above in the plugin configurations -->
        <!-- assume that both of these plugins will execute in a phase later than 'initialize' -->
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>${my.compiler.version}</source>
                        <target>${my.compiler.version}</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>maven-bundle-plugin</artifactId>
                    <configuration>
                        <!-- sorry if this part isn't correct; never used this plugin before -->
                        <instructions>
                            <Bundle-RuntimeExecutionEnvironment>${my.execution.environment.version}</Bundle-RuntimeExecutionEnvironment>
                        </instructions>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
于 2012-10-18T20:06:09.573 に答える
2

この複雑なシナリオを解決するためのエレガントなMavenの方法はないと思います。サブモジュールの数が膨大になった場合、あなたもDuncanが提案したソリューションも保守が容易なIMOではありません。

最大限の保守性を実現するために、Mavenがうまく機能しない場合に備えて、シェルスクリプト(および/またはWindowsのバッチファイル)を作成します。たとえば、すべてのサブモジュールをループし、に基づいてデフォルトとプロパティをリセットするset-version.sh(および) 、は、さまざまなバージョンを操作するための単一の中心的な場所を提供します。ご覧のとおり、短所はこれが実際にはMavenソリューションではないことです。バージョンのカスタマイズが必要になるたびに、実行する必要があります。set-version.batjava.compiler.sourceosgi.breeversion-feed.txtversion-feed.txtset-version.shmvn ...

さらに、ビルド/リリースの標準化では、maven-enforcer-pluginversion.setを使用して、プロパティ(によってフラグが付けられている)に基づいてビルドプロセスを再生/一時停止し、set-version.sh開発者が正しい手順に従わない場合に警告/エラーメッセージを表示します。ビルドを行っています。またversion.set、を実行する代わりに、すべてのサブモジュールで定義されたデフォルト値を使用する場合set-version.shは、親pom.xmlまたはコマンドラインパラメーターから直接trueに設定するだけで柔軟性が得られます。

サンプルディレクトリ構造:

parent/
    module-a/
    module-b/
    module-c/
    ... ...
    pom.xml
    set-version.sh
    set-version.bat
    version-feed.txt

これが理にかなっていることを願っています。

于 2012-10-18T10:15:42.580 に答える