我没有广泛使用过Maven
目前有5个不同的maven项目,每个项目都有不同的pom.xml。截至目前,它们之间存在依赖关系,每个都指向<依赖>如果需要的话。
目前我们不喜欢的是
我的想法是什么(可能不正确)
胖箭头表示父子关系,细箭头表示子模块。但这似乎不起作用,请参阅下面的代码和错误
儿童项目2 pom
<groupId>ChildProject2</groupId>
<artifactId>ChildProject2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>Parent</groupId>
<artifactId>Parent</artifactId>
<version>${parent.version}</version>
<relativePath>../Parent/pom.xml</relativePath>
</parent>
<dependencies> ... </dependencies>
ChildProject2 - 错误 项目构建错误:不可解析的父POM:未能转移父级:父级:pom:来自http://repo1.maven.org/maven2的$ {parent.version} 缓存在本地存储库中,在中心的更新间隔过去或强制更新之前,不会重新尝试解析。原始错误: 无法传输工件Parent:Parent:pom:$ {parent.version} from / to central(http://repo1.maven.org/maven2):索引45处路径中的非法字符: http://repo1.maven.org/maven2/Parent/Parent/ $ {parent.version} / Parent - $ {parent.version} .pom和'parent.relativePath'指向错误的本地POM
家长pom
<groupId>Parent</groupId>
<artifactId>Parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<parent.version>0.0.1-SNAPSHOT</parent.version>
</properties>
<modules>
<module>../ChildProject2</module>
<module>../ChildProject1</module>
</modules>
<dependencies> ... </dependencies>
GrandParent2 pom
<groupId>GrandParent2</groupId>
<artifactId>GrandParent2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<properties>
<grandparent2.version>0.0.1-SNAPSHOT</grandparent2.version>
</properties>
<modules>
<module>../Parent</module>
</modules>
<dependencies>... </dependencies>
ParentMain.java
public class ParentMain {
public static void main(String[] args) {
DocumentFactory df = new DocumentFactory();
ChildProject1Main cp1 = new ChildProject1Main();
ChildProject2Main cp2 = new ChildProject2Main();
}
}
ParentMain - 错误
我目前正在使用 Maven版本 2.2.1(如果可以使用已升级的maven版本解决此问题,则可以升级) 下面的一条评论说可以使用“Jenkins和TeamCity等CI工具”解决这个问题。 任何指针(示例)如何使用Maven(和或Hudson)解决这个问题?吗
我做错了什么,如何为这样的项目依赖项获得最佳设计
答案 0 :(得分:1)
当我看到这个图时,我想到的第一个问题是,“为什么业务逻辑对子模块有任何依赖性?”我想到了两个想法,我会仔细阅读每一个想法以及你不应该做些什么来重复这些想法。
紧密耦合的代码。这表现在代码重复或大类/方法的气味。
您希望您的代码模块化,这样项目只需依赖于它所需的内容,以便编译和运行而不会出错。
不合逻辑的代码层次结构。这(最终)表现为循环依赖关系,或者当<exclude>
块出现时突然丢失的依赖关系。
您需要的内容取决于显式的内容,以便您的代码层次结构布局合理。
我将把你的箭头放在一个基数上,意味着项目依赖于另一个,所以UI和CLI依赖于业务逻辑来运行是有意义的。有意义的是,Business Logic可以依赖于子模块来完成与核心不太相关的其他功能。
不有意义的是这些儿童模型还依赖于商业逻辑。子模块应该足够独特,不需要依赖Business Logic的任何东西;如果他们这样做,那么也许他们应该住在那里。
至于版本控制 - 有一些CI工具,例如Jenkins和TeamCity可以帮助你解决这个问题。我们的目标是建立一种独立于人为干预/错误的方式。
答案 1 :(得分:0)
How do I tell Maven to use the latest version of a dependency?
看一下上面的帖子。我喜欢Adam Gent使用版本插件在jenkins中更新poms版本的答案。我同意他认为maven和持续部署是一个特别糟糕的比赛。
因此,对于任何共享配置(插件,依赖项等)使用它和一个简单的父pom,但不要使它们成为多模块项目和版本,并将父pom作为独立的东西释放。