这是一个很长的故事。我目前的地方使用Ant进行构建。他们创建了大约20个不同的基础类罐,用于多个项目。最初,这些项目会检查他们所需的各种罐子的特定版本,然后再也不会更新它们。这意味着每个应用程序都有与其他项目和我们的服务器不兼容的jar。接踵而来。
为了解决这个问题,我立即引入了一个Maven存储库,并将Ivy集成到我们的Ant构建中。不再检查罐子。相反,您从Maven存储库中获取正确的版本。最初,我希望开发人员保持ivy.xml
版本号的最新版本,但他们从未这样做过。相反,Ivy集成和设置依赖于外部Subversion项目。这使我能够将Ivy与旧build.xml
文件的最小更改集成在一起。我在该外部常春藤项目中添加了一个ivy.version.properties
文件,并在那里维护各种罐子的版本号。有一个企业范围的版本号。
各种项目使用${corporate.version}
属性作为基础jar版本号。当我更新ivy.version.properties
文件时,所有项目都会使用正确的基础类版本号进行更新。我们使用<ivy:makepom>
为我们的项目生成pom.xml
,并使用它将我们的罐子和战争部署到我们的Maven存储库中。
结果:我不再需要担心开发人员保持项目版本号同步。我作为发布工程师通过更新那个ivy.version.properties
文件来处理它。所有项目都是同步的。
现在,我们正在转向Maven,我希望能够做同样的事情。我怀疑开发人员会记得用正确的版本号更新他们的pom.xml
,所以我想从另一个文件中读取它,并使用它。
有两个问题:一个是Maven在执行任何目标之前首先读取项目的版本号。 pom.xml
中没有版本号,生成的jar没有版本号。
即使我设法完成第一步,我们也知道pom.xml中没有用于基础类的版本号。当Maven下拉pom.xml
以获取依赖项时,它无法确定哪个版本。
是的,我可以将其放入公司pom.xml
并将其作为所有其他项目的父项目。我们已经有一个父项目来帮助设置所有项目的各个方面。我可以在那里放一个基础类版本号。但是,这意味着开发人员现在必须更新每个版本的父项目的版本号。如果开发人员无法信任每个版本更新项目的版本号,那么是什么让您认为他们会为每个版本的父版本做到这一点?
我知道其他人一定遇到过类似的问题。你怎么处理这个?
我可以使用Ant脚本从模板pom.xml
生成pom.xml
,但这看起来有点傻。
我想知道Maven是否可以动态生成pom.xml
然后使用它来继续执行正确的目标。例如,我输入mvn package
,Maven将获取template.pom.xml
文件,填写缺失的版本号以生成generated.pom.xml
文件,然后对生成的mvn package
执行import UIKit
import SpriteKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scene = GameScene(size: CGSize(width: 1024, height: 768))
// Configure the view.
let skView = self.view as! SKView
skView.showsFPS = true
skView.showsNodeCount = true
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
override func prefersStatusBarHidden() -> Bool {
return true
}
}
POM。
或者,有没有更好的方法来解决这个问题?基本上,我需要控制所有项目中版本的版本号。这样,所有项目都使用相同版本的基础类。此外,我通过这种方式控制其他jar的其他版本(如log4j)。我和Ant和Ivy一起完成了这个,现在我想转移到Maven。
答案 0 :(得分:0)
我认为最好的选择是创建一个包含所有依赖项的pom.xml,然后使用import导入它在开发人员项目paren pom.xml中
所以,在项目父POM中:
<properties>
<corporate.version>...</corporate.version>
<properties>
...
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.mycompany.libs</groupId>
<artifactId>foundation<artifactId>
<version>${corporate.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
...
</dependencies>
</dependencyManagement>
因此,对于新的基础库集,您将部署一个包含所有版本的新pom.xml,并更新相关父pom.xml文件中的${corporate.version}
。您甚至可以在版本尚未修复时使用这些版本号定义-SNAPSHOT工件。
答案 1 :(得分:0)
我们实际上遇到了同样的问题而且我知道从不更新他们的poms和稳定性方面的“懒惰程序员”之间存在权衡:“突然”更改基础罐的版本可能会导致意外构建失败。
如果您真的想要您描述的行为,我会将所需的依赖项放入SNAPSHOT pom中,并将其用作父pom或将其作为BOM导入。通过这种方式,您可以更改内容,并且每个人都会在下次更新时提取新内容。
答案 2 :(得分:0)
我认为这是一个愚蠢的想法,而且永远不应该做。开发人员有责任更新他们自己该死的POM,并确保他们正在提取正确的版本。这是它应该的方式,开发人员应该只是学会这样做(技术术语是什么?...哦,是的) 正确的方式 。
我最初实现这个是因为公司有类似的东西(这不起作用)而且我在让开发人员做他们应该做的工作时遇到了问题。并且,开发人员喜欢它,因为当出现问题而不是他们时,我现在正式负责。这是你做别人工作时得到的。
我已经说服公司停止尝试保留我们所有核心罐(我们其他项目中使用的罐子)和我们的版本号相同的版本。相反,每个项目都有自己的版本。只有当实际发生变化时,Jars才会发布版本,而不是当我们强制升级到版本时。而且,开发人员必须知道他们所依赖的各种罐子的版本。
答案 3 :(得分:0)
使用maven-release-plugin。该插件可以在所有pom.xml文件上标记版本号。该插件还了解版本控制,并且知道如何标记Maven项目以进行发布(或分支)。