使用这种方案发布Maven项目是否是一个好主意:
<groupId>com.oresoftware</groupId>
<artifactId>async.1</artifactId>
<groupId>com.oresoftware</groupId>
<artifactId>async.2</artifactId>
<groupId>com.oresoftware</groupId>
<artifactId>async.3</artifactId>
这些代表项目的主要版本吗?这不是创建不同名称空间的有效方法,这样树中的不同依赖项可能依赖于此库的不同版本吗?有人这样做或这是不好的做法吗?
我什至也在考虑使用次要版本为它们命名:
<groupId>com.oresoftware</groupId>
<artifactId>async.1.1</artifactId>
<groupId>com.oresoftware</groupId>
<artifactId>async.1.2</artifactId>
<groupId>com.oresoftware</groupId>
<artifactId>async.1.3</artifactId>
更新,据说这是Apache Commons在版本3和版本4之间所做的,这是两个不同的导入:
版本3:
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
版本4:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
所以我的问题是-使用不同的包名称或名称空间,使用其他 artifactId 是否足够?还是我们还需要其他 groupId ?
答案 0 :(得分:3)
否,如果类的 package 名称也不同,则只是一个不同的 namespace 。
由于它们可能没有,所以您只是在设置麻烦,因为现在可以添加多个版本的类。鉴于类路径的顺序通常是无序的(例如,在Webapp中),因此在编译时和/或运行时您会实际看到哪种顺序是任意的,从而导致不可预测的行为。
现在,如果还像Apache Commons Collections在版本3.x和4.x之间所做的那样重命名软件包,那么您也应该重命名Maven组/工件,因此可以在类路径上同时使用它们。
否则,您应该尝试使代码向后兼容,以便可以使用较新版本的库而不会引起问题。
答案 1 :(得分:1)
您可以 做到这一点,就像Andreas在另一个答案中提到的那样。但这很少完成。
我自己也考虑过类似的概念,我想主要原因是从版本n升级到n + 1变得更加困难。您需要遍历所有代码并替换导入。此外,如果在接口中使用库中的对象,则会将方法参数绑定到库的特定版本(通过导入),从而使互操作性更加困难。
通常,从n升级到n + 1并不意味着一切都会中断,但可能只是一点点,因此遍历所有代码可能比接受常规版本方案的问题更难。
答案 2 :(得分:1)
如果这样做,则还必须更改类的包;否则会给客户带来更多冲突。看着公共收藏罐;版本3的软件包为org\apache\commons\collections\..
,而在版本4中,他们将软件包更改为org\apache\commons\collections4\..
。
以便客户端可以导入两个库,并在运行时使用它们,并且仍然没有冲突。
因此要回答您的问题,仅更改组id / artifactId还不够。您可以更改版本(并保持groupId / artifactId不变);这样行家/毕业会选择例如。如果导入了版本1和2,则为版本1。但是,如果您更改了artifactId,那么您将绕过基于版本-s的冲突解决机制。客户可以同时导入两者。然后,为了避免冲突,您必须更改程序包名称(对于jar中包含的所有类)。
答案 3 :(得分:0)
好的,这是计划
保持 groupId 不变
对于每个主要版本更改,将 artifactId 从import React, {Component} from "react";
import {connect} from "react-redux";
import {addTodo, toggleTodo} from "./todos";
const mapState = (state) => ({todos: state.todos});
const mapDispatch = {addTodo, toggleTodo};
// Named export for the class
export class TodoList extends React.Component { /* */}
// Default export for the connected component
export default connect(mapState, mapDispatch)(TodoList);
更改为async1
到async2
,版本字段将为async3
然后是1.x.x
,然后是2.x.x
在代码库中,目录结构需要从3.x.x
更改为src/main/java/com/oresoftware/async1
到src/main/java/com/oresoftware/async2
就是这样.. AFAICT