我正在与三个maven项目一个RESTful webapp。这是我的行家设置(从一些细节条纹)向后兼容神器版本
客户(第二版):
<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>
模型(第二版):
<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应用程序(第二版):
<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>
对于每个版本,我都会更新模型的包名以确保唯一的类名。
类Foo在com.mycompany.app:app-model:1.0
package com.mycompany.app.model.v1;
public class Foo {
private String name;
}
类Foo在com.mycompany.app:app-model:2.0
package com.mycompany.app.model.v2;
public class Foo {
private String name;
private int age;
}
在第一释放一切正常,因为webapp只依赖于com.mycompany.app:app-model:1.0。 在第二个版本中,maven决定只依赖com.mycompany.app:app-model:2.0。 这是正常的行为,我明白为什么这是正常情况下的好事。 尽管如此。我的Backwords compapility代码(在服务器中)希望使用com.mycompany.app:app-model:1.0中的类,因为在该版本中发布的客户端使用这些类。 而较新的客户端(版本2.0)的代码想要使用com.mycompany.app:app-model:2.0类。
我敢肯定,有一种欺骗maven依赖两种方式,但如何? 通常,当我在这种情况下结束时,闹钟会在我的脑海中出现,而且我的解决问题的方式通常有问题。 但我似乎无法在这里找到另一计算策略,不包括其他的“大”弊端:( IDEES人?
谢谢你的回答。我想我需要清理。我的意思是“对于每个版本,我更新模型的包名以确保唯一的类名”就是您所描述的。即Foo类将取决于发行版是com.mycompany.app.model.v1.Foo和com.mycompany.app.model.v2.Foo,因此它们将在它们自己之间是唯一的,并且可以位于相同的类路径中。还有什么想法? –
哎呀,我很抱歉!我错过了那部分。 (脸红)我认为最简单的解决方案可能是每个版本都有不同的工件ID。这将有助于确保您的所有Maven插件都能正确解释依赖关系,并强化了v2不是v1的直接替代品的事实。 – matts
是的,也许这是要走的路。这绝对会让maven更快乐。但另一方面,Maven只是我的建筑工具,不应该指定我设计项目的方式。在我看来,_version_只是处理api演变的正确概念。第三,com.mycompany.app:app-model-v1:1.0似乎有点多余,让我感到困惑。尽管如此,在使用maven方法的时候肯定有一点意义......我会在做出任何决定之前详细阐述@Esko的建议,并感谢您的意见。 –