私は 3 つの Maven プロジェクトで RESTful Web アプリケーションに取り組んでいます。これは私のMavenセットアップです(いくつかの詳細からストライプ化されています)
クライアント (第 2 リリース):
<project>
<groupId>com.mycompany.app</groupId>
<artifactId>app-client</artifactId>
<version>2.0</version>
...
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>app-model</artifactId>
<version>2.0</version>
</dependency>
</project>
モデル (2 番目のリリース):
<project>
<groupId>com.mycompany.app</groupId>
<artifactId>app-model</artifactId>
<version>2.0</version>
</project>
...
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<configuration>
<generatePackage>com.mycompany.app.model.v2</generatePackage>
</configuration>
</plugin>
Web アプリケーション (2 番目のリリース):
<project>
<groupId>com.mycompany.app</groupId>
<artifactId>app-webapp</artifactId>
<version>2.0</version>
...
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>app-model</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.mycompany.app</groupId>
<artifactId>app-model</artifactId>
<version>2.0</version>
</dependency>
</project>
リリースごとに、モデルのパッケージ名を更新して、クラス名が一意になるようにします。
com.mycompany.app:app-model:1.0 のクラス Foo
package com.mycompany.app.model.v1;
public class Foo {
private String name;
}
com.mycompany.app:app-model:2.0 のクラス Foo
package com.mycompany.app.model.v2;
public class Foo {
private String name;
private int age;
}
最初のリリースでは、webapp は com.mycompany.app:app-model:1.0 のみに依存するため、すべてが機能します。2 番目のリリースでは、maven は com.mycompany.app:app-model:2.0 のみに依存することを決定します。これは正常な動作であり、通常のケースでこれが良いことである理由を理解しています。それにもかかわらず。そのリリースでリリースされたクライアントはこれらのクラスを使用するため、(サーバー内の) Backwords 互換性コードは com.mycompany.app:app-model:1.0 のクラスを使用したいと考えています。また、新しいクライアント (バージョン 2.0) のコードでは、com.mycompany.app:app-model:2.0 クラスを使用する必要があります。
両方に依存するようにmavenをだます方法があると確信していますが、どのように?通常、このような状況に陥ると、頭の中でアラームが鳴り、問題を解決する方法に問題があることがよくあります。しかし、他の「より大きな」欠点を含まない別のアプローチをここで見つけることができないようです:(誰かアイデアはありますか?