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

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

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

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

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

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

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

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

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

一般的eclipse版本控制方案:

vmnq 

哪里

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

m:主要变化 – 新function,新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。

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

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

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

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

.NET对Java的优势在于库与操作系统的关系更紧密。 框架库(如果已安装)可轻松放置在GAC中,这样做的确可以简化操作,但您也几乎只限于Windows。 一个更好的比较是Mono,但我没有任何经验。

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

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

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

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

不确定解决方案是什么。

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

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

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