我相信我已经非常清楚地以简洁的方式提出了这个问题。我为什么这么问?
我将向学生解释Ruby on Rails框架,这需要我对Java世界进行一些类比(因为课程是以Java为中心的)。我没有Ruby on Rails的实践经验,但我觉得Gem / Jar类比是有效的。
或许有人可以对这个问题有所了解吗?
答案 0 :(得分:26)
作为一个简短的回答,我会说:是的,它是有效的。
作为一个很长的答案,我会说:是的,它是有效的,但也有一些重要的区别,你可能也想描述。
一个罐子有一些品质,使它与宝石非常不同。 JAR是打包的可执行库,您通常必须在调用时在Java程序的执行中显式声明依赖关系(通过在调用java解释器时将jar声明为依赖项)。除了几个明确定义的文件位置之外,jar对其执行的结构很少(例如,目录结构必须镜像包路径)。
Gem是用于永久地将库安装到系统的描述符,以及可用于在运行时期间声明为依赖项的功能包。 gem有一个严格的版本控制语法作为其定义的一部分,而宝石往往是从少数集中式存储库中分发的,这些存储库花费了大量的精力来确保gem名称的唯一性。 Gems可以明确地声明它们对其他gem的依赖性。 (与JAR相比,您必须确保在调用时满足jar的所有依赖关系,并且jar没有明确地承担依赖声明或解析的责任)。此外,gem工具内置了一些可选功能,非常方便,例如,如果用户希望“运行gem”,您可以声明要调用的gem的默认可执行文件,并且您可以声明单元测试套件对于gem,以便安装gem的用户可以确保其功能。
此外,您可能想要向您的学生描述RubyGems是一个独立于Ruby语言本身创建的工具,并且它受益于许多不便之处和管理罐子引起的抱怨已经从多年的Java开发中暴露出来
答案 1 :(得分:3)
我不确定那么容易......
我认为Gem基本上和jar一样,但Gem必须有一个名字和一个版本,一个jar没有这个,嗯,让我们说......,限制。
Jar机制是为包装和包装而创建的。 Gem中最重要的是恕我直言,是RubyGems项目 RubyGems功能集比包装更大,涉及包分发和安装。
我认为Apache Maven分发和安装机制是Java社区与Ruby Gems最接近的事情。
答案 2 :(得分:2)
将它们与JAR进行比较的简单探索对于基本的Ruby类来说已经足够了。有关更详细的探索,请参阅holychao的答案。我想到的分析是,Gem是Ruby的CPAN对Perl来说。