我正在开发一个带有三个 Maven 项目的 RESTful webapp。这是我的 Maven 设置(从一些细节中删除)
客户端(第二版):
<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>
Webapp(第二版):
<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。在第二个版本中,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 来依赖两者,但是如何呢?通常当我最终陷入这种情况时,我的脑海中就会出现警报,而且我解决问题的方式通常有问题。但我似乎无法在这里找到另一种方法,它不包括其他“更大”的缺点:( 有人想吗?