我正在尝试设置,我认为是一个非常标准的库。它拥有各种标准支持功能和与第三方集成的接口。在这里做一些事情,以便更容易展示。首先,我有这个结构:
├── pom.xml // parent pom
├── external
│ └── external_system1
│ └── pom.xml // pom for external_system1
├── internal
│ └── internal_system1
│ └── pom.xml // pom for internal_system1
└── util
└── configuration
└── pom.xml // pom for configuration
我们有一些实用程序函数用于调用和连接到不同的系统,但也用于日志记录和配置。这有一些内部依赖关系,例如大多数(如果不是全部)依赖于上面的配置。
主要由于内部依赖性,我想在同一版本中保留所有项目。因此在父pom中我有版本,那当然是全局的。在具体的项目poms我有所需的兄弟姐妹的依赖。我试图用属性替换那里的版本字符串,我用于父pom中的版本的相同属性。然而,mvn似乎并没有接受它,因为它给了我:
[ERROR] 'dependencies.dependency.version' for com.mycomapany.myproject:util-configuration:jar must be a valid version but is '${myproject.version}'. @ line 32, column 1
我可以通过将所有依赖项放在父pom中来解决这个问题,我可以使用myproject.version属性。这引出了几个问题:
它不会破坏父pom中所有依赖项的目的吗?在我看来,将它们列在pom中以实际具有依赖性的特定部分是非常有意义的。对我来说,它有助于提高可读性,因为我可以很容易地看到任何依赖。
当我以后使用这个库和汇编插件构建一些东西时会发生什么?我们正在构建独立的罐子,并且不想将每个罐子中不需要的所有依赖项拉入其中,或者它只是拉入每个罐子实际使用的那些依赖项? IE如果我有一个依赖于上面的util-configuration的项目,它会拉入util-configuration的父pom中列出的所有兄弟节点,还是会看到那里有很多未使用的东西?
这背后的原因是什么?显然我在这里认为理智(将依赖关系放在尽可能低的水平)并不被认为是理智的。我在Sonatype和pom documentation at maven浏览了两本书,但我看不出有关推理的解释。
在儿童poms中,我指的是父版pom。什么是理智的方式?是使用mvn versions:set -DnewVersion=
还是有另一种方式?这是否适用于使用属性或我必须有两个版本字符串版本:设置为工作?一个用于父pom本身的属性(没有变量),一个用于所有依赖项(使用属性设置,所以我不必在20-ahh位置更改)?
我意识到上面的第4点可能不太清楚但是现在我在父pom中有这个:
<version>${myproject.version}</version>
...
<dependency>
<groupId>com.mycompany.myproject</groupId>
<artifactId>util-configuration</artifactId>
<version>${myproject.version}</version>
</dependency>
...
<properties>
<myproject.version>0.0.1-SNAPSHOT</myproject.version>
我想问的是,如果以上内容适用于versions:set
,或者我是否必须将第一个更改为字符串,然后在碰撞版本后必须编辑myproject.version属性。< / p>
很抱歉很长的问题,但他们感觉非常紧密。
*编辑
在当前(工作)父pom的片段中添加了myproject.version
,使其对我的属性更加清晰,下面我添加了我想要的内容(以及对我来说有意义的内容){{ 1}} pom文件,其依赖关系为myproject-internal-somesystem
。也就是说,使用来自父项的myproject-util-configuration
属性,因此在碰撞项目版本时,我不必编辑所有单个poms并碰撞它们的依赖项。这不起作用,相反,如果我想使用myproject.version
,我必须在父pom中有依赖。
myproject.version