平台强制版本控制机制是java最急需的功能吗?

时间:2009-02-20 23:12:20

标签: java dependencies versioning jar

作为开发人员,我经常对可以让您的生活更轻松的新语言功能感兴趣。例如,java 5为该语言带来了泛型和注释,这些功能肯定可以提高您的工作效率。

然而,当我回顾近十年来在java平台上工作时,我发现与版本相关的问题是非生产性和不必要的努力的最大罪魁祸首。寻找正确版本的jar的小时和小时,试图协调一些版本冲突,升级依赖库等。当我开始使用java时,事情并不那么困难,你有几个第三方库,就是这样。今天,您可以轻松使用典型的Web应用程序:Spring Framework,Hibernate,Struts,您可以使用它。所有这些都带有许多依赖的第三方库。今天,我的耳档将通常包括大约40个或更多第三方库。一个真正的罐子地狱!

使用注释,我不必管理Hibernate的配置文件。一个很好的功能,但我没有看到由于我将描述符保存在单独的文件中而产生的许多问题。使用泛型,我不会编写演员语句,但在我的整个编程载体中,我记不起一个可以通过使用类型安全容器来防止的错误。版本问题的解决方案不会更有价值吗?

所有这些问题导致了许多工具,例如MavenivyOne JarJar Jar Links(不开玩笑!),甚至名称为Jar Hell即使您使用其中一些工具,您也远远不能解决问题。我使用Maven 2,这是一个很好的帮助。不过,它本身就是一个世界。新手程序员可能需要一段时间来学习它。将您的遗留项目移动到Maven结构也很痛苦。

似乎在.Net中他们已经用dll地狱吸取了教训,并且.Net程序集的管理要简单得多。

似乎有计划为java平台和像OSGI这样的替代品解决这个问题。我认为急需一些基本的和平台强制的版本控制机制

5 个答案:

答案 0 :(得分:5)

我已经使用Java十多年了,但我不得不说我没有找到很多 JAR地狱问题(甚至使用你提到的所有第三方工具)!我发现Maven是一个可怕的工具,因此使用ant构建所有内容。

在我们公司,我们有一个基于每个项目的简单(小)依赖文件的定制依赖解决ant任务,同时将每个项目定义为app或{{1 (你应该只依赖lib;永远不依赖lib)。它运作得很好。

我们还有app个任务来修改我们的eclipse ant和IDEA .classpath文件,以便为我们的IDE生成依赖图。

答案 1 :(得分:4)

看看OSGi - 它很好地处理了捆绑(罐子)的版本控制和管理。

另外:Eclipse(构建于OSGi之上)有一些相对较新的API工具,可以帮助您将API与之前的基线进行比较,并确定如何正确表达捆绑包的下一个版本号。

一般的日食版本控制方案:

v.m.n.q

,其中

v:高级版本 - 此处的更改通常表示API中的重大更改

m:重大变化 - 新功能,新API

n:微小的变化 - 相同的API,幕后更改

q:限定符 - 用于标记构建,alpha / beta等

OSGi使用范围指定版本依赖性。例如

Require-Bundle: com.javadude.foo;bundle-version="[1.2.0,2.0.0)"
MANIFEST.MF中的

指定捆绑包需要捆绑com.javadude.foo的1.2.0或更高版本,直至(但不包括)版本2.0.0。

您也可以在包级别指定依赖项。

答案 2 :(得分:0)

.NET优于Java的优点是库与操作系统的关系更紧密。框架库(如果已安装)很容易找到GAC的事实确实简化了事情,但您也非常局限于Windows。一个更好的比较是Mono,但我没有任何经验。

配置管理,至少对我来说,一直是软件开发的巨大痛苦。您尝试利用现有代码的次数越多,它看起来就越糟糕。问题本身并不是Java所独有的,但版本的激增,平台的使用时间以及支持的平台数量似乎使情况变得更糟。我刚刚检查过,我的盒子上有3个版本的JRE - 我甚至都不是活跃的Java开发人员。

关于你的问题,我不确定这是否是最紧迫的功能需求。就个人而言,我希望看到一些更好的Web服务支持,特别是那些需要身份验证标头的服务。我最后一次尝试让Java与我的一个.NET Web服务进行交互时,我几乎把头发弄掉了。将LINQ与C#/ .Net一起使用后,我还可以说这对Java来说是一个非常酷的补充,可以说可以提高生产力。

答案 3 :(得分:0)

.NET支持并排程序集,因此您可以拥有相同应用程序的多个版本。 GAC就像共享DLL一样,但是你仍然可以在GAC上注册同一程序集的多个版本,如果我记得很清楚,另一个程序集可以请求某个或更大版本。在JavaEE中,你确实有几个类加载器级别,你可以做一些模拟类似版本的技巧

答案 4 :(得分:0)

我在我工作的网站上遇到过这个问题:构建了一个工具来运行生活在网络服务器上的jar文件,找到jar文件的所有嵌套副本 - 以及具有相同名称的不同文件(例如: log4j.jar)。这是一个可怕的混乱,包括一个内部的WebLogic jar 的WAR。

不确定解决方案是什么。

事情是:java 东西来管理这个 - 用包版本标记的jar文件。特别是:webstart。也许所需要的是某种类似于webstart类型的类加载器。

如何:在JAR清单中,使用众所周知的名称和版本指定库依赖项。类容器 - 由容器或运行时提供 - 将负责获取所需的版本。

有很多系统(例如:Maven本身)用于管理着名的下载库的地方,以及fink和诸如此类的东西。