8

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

然而,当我回顾近十年在 java 平台上的工作时,我发现版本控制相关的问题是导致效率低下和不必要的努力的最大罪魁祸首。寻找正确版本的 jar,尝试调和一些版本冲突,升级依赖库等数小时和数小时。当我开始使用 java 时,事情并没有那么困难,你会有一些 3rd 方库,仅此而已. 今天,您的典型 Web 应用程序可能很容易使用:Spring Framework、Hibernate、Struts,应有尽有。所有这些都带有许多相关的第 3 方库。今天,我的耳朵档案通常包括大约 40 个或更多的 3rd 方库。一个真正的罐子地狱!

例如,使用注释,我不必管理 Hibernate 的配置文件。一个不错的功能,但我没有看到由于我将描述符保存在单独的文件中而引起的许多问题。使用泛型,我不必编写强制转换语句,但在我的整个编程载体中,我不记得使用类型安全容器可以防止的单个错误。版本控制问题的解决方案不是更有价值吗?

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

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

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

4

5 回答 5

5

我也使用 Java 十多年了,但我不得不说我根本没有发现很多JAR 地狱问题(即使使用你提到的所有 3rd-party 工具)!我发现Maven这是一个可怕的工具,所以用ant.

在我们公司,我们有一个定制的依赖解决ant任务,它基于每个项目的简单(小)依赖文件,以及将每个项目定义为 anapp或 a (你应该只依赖 a ;从不lib依赖)。它工作得很好。libapp

我们还有一些ant任务来修改我们的 eclipse.classpath和 IDEA.iml文件来为我们的 IDE 生成依赖关系图。

于 2009-02-21T11:36:30.450 回答
4

看看 OSGi——它很好地处理了版本控制和包(jar)的管理。

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

通用的 Eclipse 版本控制方案:

v.m.n.q

在哪里

v:高级版本 - 这里的更改通常代表 API 中的重大更改

m:主要变化 - 新功能,新 API

n:小改动 - 相同的 API,幕后改动

q: qualifier - 用于标记构建、alpha/beta 等

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

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

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

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

于 2009-02-24T17:28:16.370 回答
0

.NET 相对于 Java 的优势在于这些库与操作系统的联系更紧密。框架库(如果已安装)很容易位于 GAC 中这一事实确实简化了事情,但您也几乎仅限于 Windows。更好的比较是 Mono,但我没有任何经验。

至少对我而言,配置管理一直是软件开发的一大痛点。您尝试利用现有代码的次数越多,它似乎变得越糟糕。这个问题本身并不是 Java 独有的,但版本的激增、平台存在的时间以及支持的平台数量似乎确实使情况变得更糟。我刚刚检查了一下,现在我的盒子上有 3 个版本的 JRE —— 而且我什至不是一个活跃的 Java 开发人员。

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

于 2009-02-20T23:29:26.597 回答
0

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

于 2009-02-21T03:32:32.097 回答
0

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

不确定解决方案是什么。

事情是:java东西来管理这个 - 带有包版本的标记 jar 文件。特别是:webstart。也许需要的是某种类型的类加载器,它可以做 webstart 类型的事情。

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

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

于 2009-02-21T12:38:48.070 回答