桥接模块系统和非模块系统的制作方法

文档序号:11160860阅读:285来源:国知局
桥接模块系统和非模块系统的制造方法与工艺

本公开内容涉及模块系统和非模块系统。具体而言,本公开内容涉及用于桥接模块系统和非模块系统的技术。



背景技术:

用于开发和维护软件的计算平台一般而言依赖两种类型的系统之一:模块系统和非模块系统。

非模块系统是指其中不同代码片之间的依赖性未严格声明或限制的系统。行业定义的术语“JAR hell”是指Java归档(JAR)文件在非模块系统中的示例使用,这导致例如对于类加载过程的问题。

模块系统包括标准模块的集合并且定义标准模块的集合如何一起工作。标准模块的集合中的每个特定标准模块可以显式地定义对其它标准模块(或者其内容)的依赖性。但是,标准模块通常在显式地依赖任何非模块代码方面受限制。

图1A示出了具有模块环境102的部件和非模块环境130的部件的系统100。非模块环境130包括非模块代码132-146。不同的非模块代码之间的依赖性不需要显式地声明。因而,当第一非模块代码依赖于第二非模块代码时,软件开发环境必须在与所有代码相关联的文件集合的所有文件中搜索第二非模块代码。不同的非模块代码之间的依赖性(可能没有显式声明)在图1A中利用箭头示出。例如,非模块代码132对非模块代码140的依赖性利用在非模块代码132开始并在非模块代码140结束的箭头示出。此外,非模块代码140对非模块代码142的依赖性利用在非模块代码140开始并分别在非模块代码142和非模块代码144结束的两个箭头示出。

模块环境102包括标准模块(例如,标准模块104-112)的集合。诸如模块环境102的模块环境中不同标准模块之间的依赖性被模块显式声明。显式声明的依赖性在本文可以被称为“显式依赖性”。模块环境102中不同标准模块(或者其内容)之间的显式依赖性也利用箭头示出。例如,标准模块104对标准模块108的显式依赖性利用在标准模块104开始并在标准模块108结束的箭头示出。另外,标准模块108对标准模块110的显式依赖性利用在标准模块108开始并在标准模块110结束的箭头示出。

如图1A中所示,在模块环境102和非模块环境130之间存在分区。具体而言,标准模块不能显式地依赖于非模块代码。例如,标准模块110不能显式地依赖于非模块代码132或非模块代码134。因此,包括标准模块的模块环境不能建立在包括非模块代码的非模块环境之上。

本节中描述的做法是可以寻求的方法,但不一定是先前已经构想或寻求的做法。因此,除非另有说明,否则不应当假定在本节中描述的任何做法仅仅由于它们包括在本节中而被认为是现有技术。

附图说明

在附图的图示中通过例子而不是限制示出了各种实施例。应当指出的是,在本公开内容中对“实施例”或“一个实施例”的引用不一定指相同的实施例,并且它们意味着至少一个。在附图中:

图1A示出了在模块环境中的标准模块和在非模块环境中的非标准模块;

图1B和1C示出了根据一个或多个实施例的系统;

图2示出了根据一个或多个实施例用于生成桥接模块的操作集合;

图3A-3D示出了根据一个或多个实施例的详细例子;及

图4示出了根据一个或多个实施例的系统。

具体实施方式

在下面的描述中,为了解释的目的,阐述了众多具体细节,以便提供对本公开内容的透彻理解。一个或多个实施例可以在没有这些具体细节的情况下实践。在一个实施例中描述的特征可以与在不同实施例中描述的特征组合。在一些例子中,众所周知的结构和设备参照框图形式来描述,以避免不必要地模糊本发明。

1.一般概述

2.体系架构概述

3.开发环境例子

4.生成用于桥接模块环境和非模块环境的桥接模块

5.示例实施例

6.杂项;扩展

7.硬件概述

1.一般概述

在实施例中,生成桥接模块,以桥接模块环境中的标准模块和非模块环境中的非模块代码。来自模块环境的标准模块可以显式依赖于桥接模块,但不能显式依赖于非模块代码。桥接模块可以依赖于非模块代码。例如,桥接模块可以显式地引用对应于非模块代码的命名空间。例如,桥接模块可以显式地依赖于对应于非模块代码的依赖性路径。桥接模块还可以依赖于其它桥接模块以及标准模块。

在实施例中,生成桥接模块包括模块化非模块环境中的非模块代码。非模块代码的模块化可以响应于一个或多个触发事件而被执行。此外,模块化要求可被用于确定非模块代码是否可以被模块化。

模块化非模块代码不一定包括对非模块代码本身的任何修改。模块化非模块代码包括生成对非模块代码的描述,以供其它模块使用。例如,模块化非模块代码包括经由模块描述符识别并向模块系统暴露非模块代码的包。包是通过桥接模块暴露给其它桥接模块、标准模块和其它非模块代码的。桥接模块的依赖性在模块描述符中显式地指出,但是,在至少一个实施例中,不暴露给其它部件。模块化代码还可以包括识别非模块代码的依赖性路径并且在对应桥接模块的模块描述符中包括该依赖性路径。

在实施例中,操作是对至少对应于标准模块、桥接模块和非模块代码的组合集合的非编译或编译代码基执行的。例如,代码基可以被系统编译、验证或执行。

本说明书中描述和/或权利要求中陈述的一个或多个实施例可能没有包括在一般概述这一节中。

2.体系架构概述

图1B和1C示出了根据一个或多个实施例的系统的例子。其它实施例可以包括比系统中所示和/或以下描述的更多或更少的设备和更多或更少的部件。被描述为对应于一个设备的硬件部件、软件部件和/或功能可以代替地对应于另一个设备。单独示出的部件可以被组合成单个部件或者在单个设备上实现。因而,权利要求的范围不应当被认为受本文的具体例子限制。

系统101示出了与模块环境102和非模块环境130当中一个或二者相关联的部件。系统101中的部件可以依赖于系统101中的其它部件(依赖性限制在下面详细描述)。在例子中,如果第一部件需要由第二部件提供的包或服务,则第一部件依赖于第二部件。

部件之间的依赖性可以或可以不显式指出。如本文所提到的,对特定部件的显式依赖性包括其它部件的声明和/或命名空间。命名空间将资源的名称(例如,Java类)映射到资源定义(例如,类定义)。在一个例子中,命名空间被实现为依赖性路径。依赖性路径可以包括实体的有序集合作为参数。每个实体可以包含并透明地暴露命名资源定义(例如,Java类定义)的集合。在另一个例子中,命名空间被实现为类加载器。类加载器是实体,包含并透明地暴露命名资源定义(例如,Java类定义)的集合。本文提到依赖性路径的实施例和例子可以同等地适用于任何其它命名空间,例如类加载器。

在实施例中,依赖性路径识别可以但并非必须被依赖的非模块代码。依赖性路径可以在软件开发环境中被存储为环境变量或者存储在文件(例如,清单文件)中。

在实施例中,依赖性路径对应于命名空间。命名空间可以包括对应于非模块代码的相应集合的标识符集合。标识符集合可以根据策略排序。在例子中,命名空间识别Java归档(JAR)文件的集合。

在Java模块系统中,关键词“requires”被用来声明显式依赖性。关键词“requires”可以和识别另一部件或识别依赖性路径(例如,CLASSPATH)的参数一起使用。对依赖性路径的显式依赖性允许依赖于与该依赖性路径相关联的参数。在例子中,第一部件直接地或者经由依赖性路径依赖于第二部件。在图1B中为了示出第一部件依赖于第二部件,绘出从第一部件到第二部件的箭头。箭头头部指向直接地或者经由依赖性路径被第一部件依赖的第二部件。

在所示的例子中,模块环境102包括共同定义标准模块的集合如何一起工作的标准模块(例如,标准模块104-112)的集合,标准模块的集合如何一起工作包括但不限于其任何依赖性。如本文所提到的,标准模块包括具有禁止直接地或者经由依赖性路径对任何非模块代码(例如,非模块代码140-146)的显式依赖性的约束的任何模块。标准模块可以包括对其它标准模块和/或桥接模块的显式依赖性。此外,标准模块可以间接地依赖于非模块代码(例如,经由如本文所述的桥接模块)。

在实施例中,桥接模块可以充当标准模块与非模块代码之间的桥。具体而言,桥接模块是指可以(a)被标准模块依赖并且(b)依赖于非模块代码的模块。桥接模块可以在对应于非模块代码的依赖性路径上经由显式依赖性依赖于非模块代码。除了依赖于非模块代码的功能,桥接模块还可以依赖于其它桥接模块和/或标准模块。桥接模块经由模块化向标准模块、其它桥接模块和其它非模块代码暴露非模块代码的一个或多个包,如以下参照图2描述的。

在所示的例子中,标准模块108显式地依赖于标准模块110。标准模块110显式地依赖于桥接模块122和桥接模块124。桥接模块122显式地依赖于对应于非模块代码140的依赖性路径。此外,桥接模块122显式地依赖于桥接模块124。桥接模块124显式地依赖于对应于非模块代码146的依赖性路径。此外,桥接模块124显式地依赖于标准模块112。

在至少一个实施例中,具有本文所述的特点和功能的桥接模块的使用可以被限制。在一个例子中,桥接模块的生成可以被限制到系统或软件开发环境。可以禁止定义标准模块的开发者定义用于桥接模块的模块描述符。

在实施例中,系统模块化非模块代码,以获得模块化的代码(例如,模块化的代码133和模块化的代码135)。模块化非模块代码以获得模块化的代码不一定要求对非模块代码本身的任何修改。模块化非模块代码以获得模块化的代码包括基于非模块代码的内容生成数据。与模块化的代码相关联的数据在命名与模块化的代码相关联的桥接模块的模块描述符中指示。模块描述符被用于暴露(例如,通过导出)模块化的代码的包,用于由其它模块或非模块代码访问。此外,桥接模块的模块描述符可以包括对对应于非模块代码的依赖性路径的显式依赖性,而不暴露非模块代码。作为替代,模块描述符可以暴露非模块代码。用于非模块代码的模块化的详细示例操作集合在下面参照图2进行描述。

再次参考所示出的例子,图1B包括是模块化在图1A中识别出的非模块代码132和非模块代码134的结果的系统101。在非模块代码132和非模块代码134的模块化之前,诸如模块环境102的任何模块环境中的标准模块没有一个可以获得对非模块代码132-146的功能的直接或间接访问。具体而言,标准模块104-112不能显式地依赖于非模块代码132-146当中任何一个。在这个例子中,如图1A中所示,非模块代码132和非模块代码134被模块化,以分别获得如图1B中所示的模块化的代码133和模块化的代码135。

非模块代码132和非模块代码134的模块化不一定要求分别对非模块代码132和非模块代码134的任何修改。模块化非模块代码132以获得模块化的代码133包括对非模块代码132中的包的识别。非模块代码132的模块化还包括对非模块代码132(例如,对依赖性路径和/或对其它非模块)的依赖性的识别。桥接模块122向标准模块、其它桥接模块和其它非模块代码暴露模块化的代码133(之前被称为非模块代码132)的包。作为例子,桥接模块122允许标准模块110访问模块化的代码133的包。但是,桥接模块122不必向其它模块暴露模块化的代码133的显式依赖性。例如,虽然桥接模块122的模块描述符包括对对应于非模块代码140的依赖性路径的显式依赖性,但是桥接模块122不向任何其它模块暴露非模块代码140。因而,可以访问模块化的代码133的包的标准模块110不能显式地依赖于非模块代码140。替代实现可以包括向其它模块暴露非模块代码的桥接模块。在以上例子的变体中,桥接模块122向标准模块110暴露非模块代码140。桥接模块可以使用“requires public”关键词来依赖并向标准模块110暴露非模块代码140。

在例子中,桥接模块被用于向标准模块暴露非模块代码。具体而言,桥接模块向标准模块暴露被模块化的非模块代码。此外,桥接模块可以暴露模块化的代码所依赖的其它非模块代码的全部或子集。

在实施例中,非模块代码可以依赖于由桥接模块或者由标准模块暴露的包。在例子中,非模块代码146依赖于由标准模块112暴露的包,例如,在Java模块系统中经由“exports”命令。此外,非模块代码146可以访问由桥接模块122暴露的模块化的代码133的包(访问在图1B的例子中未示出)。

在实施例中,桥接模块可以无需任何标准模块地实现。如图1C中所示,系统102包括桥接模块122和124。系统102还包括非模块代码140、142、144和146。但是,系统102不包括任何标准模块。充当用于执行的入口点的主要方法或主要应用可以在模块化的代码133或模块化的代码135中实现。无标准模块的系统(例如,图1C中所示的系统102)可以是(a)永久性配置或(b)瞬时性配置,直到系统被修改为包括标准模块(例如,图1B中所示的系统101)。

3.开发环境例子

本文描述的实施例适用于任何开发环境,用于开发、调试或更新软件。为了解释,具体例子参照利用Java开发工具箱(JDK)执行的操作。除JDK之外的其它开发环境可以与JDK而不是其他的开发环境共享一些功能构造,并且JDK的大多数功能构造都不是实现本文要求保护或描述的实施例所需的。即使其它语言使用不同的名称来指相同或高度相似的功能构造,普通技术人员也将理解这些相同或高度相似的功能构造可以如何代替对应的JDK构造而结合本文要求保护或描述的实施例来使用。以下描述JDK的某些特征。但是,一个或多个实施例包括未在下面描述的附加特征和/或省略下面描述的特征。

Java程序管理两种类型的信息:原始数据和对象。原始数据包括公共的基本值,诸如数字和字符。对象通常表示更专用或复杂的东西,诸如银行帐号。对象由类(class)定义。类包含方法,方法一般表示可以对从那个类创建的对象执行的操作。

相关的类可以分组成包(package)。包的一个例子是包括用于与数据库交互的类的java.sql包(SQL代表结构化查询语言)。包的另一个例子是包括提供对绘图和创建GUI的支持的类的java.awt包(AWT代表抽象窗口化工具箱)。包可以暴露一些类(例如,对开发者非常重要的类),而隐藏与实现细节相关的其它类(例如,不可能被开发者引用的类)。暴露的类的集合被称为应用编程接口(API)。例如,java.awt包包括Java抽象窗口化工具箱API。在另一个例子中,java.sql包包括Java数据库连接API。

包的集合可以被称为类库。类库支持程序的开发和执行。编译器和类库常常打包到一起;类库也可以通过第三方供应商单独获得。

为了开发Java程序,要求编译器将Java源代码编译成Java类文件。Java源代码可以由开发者预定义(例如,在类库中)或定义。开发者可以利用任何工具生成Java源代码,该工具包括但不限于文本编辑器或完全成熟的集成开发环境(IDE)。编译器将所有Java源代码,不管是预定义的还是开发者定义的,都编译成Java类文件。包括在JDK中的javac编译器是用于将源代码编译成Java类文件的编译器的一个例子。

Java类文件(即,*class文件)包含以高效、可移植和体系架构中立的格式表示原始源代码的字节代码。字节代码由Java虚拟机(JVM)的实现执行。包括在JDK中的Hostpot是JVM实现的例子。JVM实现可以通过解释技术执行字节代码,这包括一次执行一个字节代码“语句”。JVM实现可以通过编译技术执行字节代码,这包括在运行时将字节代码转换成机器代码。在编译技术中,对于字节代码要在其上被执行的每种类型的处理器,需要用于将字节代码转换成机器代码的不同转换器。

在执行Java类文件之前,JVM实现验证Java类文件中的所有字节代码。该验证确保:(a)分支引用有效位置和(b)数据被初始化并且引用是类型安全的。验证过程的步骤(a)和(b)可以在利用类加载器加载类时执行。

类加载器是负责首先定位类的二进制表示、然后将该二进制表示传递到JVM以便在存储器中创建类的对象。定位之后跟着创建的过程被称为“类加载”。类加载可以在JVM执行一个类中的代码并解析那个代码对其它类的引用时被JVM触发。JVM可以根据需要通过程序触发对类的类加载,而不是一次将所有类都加载到存储器中。类加载还可以由Java程序触发,因为类加载器是普通对象,该普通对象的类(java.lang.ClassLoader或子类)向定位和创建类暴露方法。

Java运行时通常与三个或更多个类加载器相关联。一个类加载器是用于加载信任类的“引导程序”类加载器(也被称为“原始类加载器”)。另一个类加载器是“扩展”类加载器,其将类加载委托到引导程序类加载器或者从指定的目录加载。扩展类加载器将通常加载“非核心”和/或不太信任的类。另一个类加载器是用于加载开发者定义的类的“应用”类加载器。应用类加载器从命名空间加载类。命名空间可以参考CLASSPATH。本文所述的各种实施例参考CLASSPATH的使用。如果Java程序创建其自己的类加载器,则在那个类加载器尝试定位和创建类之前,那个类加载器通常“委托”到与Java运行时相关联的类加载器。

4.生成用于桥接模块环境和非模块环境的桥接模块

图2示出了根据一个或多个实施例用于生成桥接模块环境和非模块环境的桥接模块的操作集合。桥接模块可以为非模块代码集合中的任何非模块代码生成,而不管该非模块代码位于依赖性路径中何处。在例子中,第一非模块代码经由依赖性路径依赖于第二非模块代码。第一非模块代码和第二非模块代码当中任意一个可以在第一非模块代码和第二非模块代码当中另一个的模块化之前被模块化或者不需要另一个非模块代码的模块化。

图2中所示的一个或多个操作可以被修改、重新布置或者完全被省略。因而,图2中所示的操作的特定序列不应当被认为限制一个或多个实施例的范围。

最初,检测用于模块化非模块代码的触发事件(操作202)。在实施例中,触发事件是显式地请求非模块代码的模块化或者隐含地要求非模块代码的模块化的命令或操作。如果命令要求非模块代码的模块化版本,则可以要求非模块代码的模块化。在例子中,将执行利用关键字“MODULEPATH”的与模块相关的命令。与模块相关的命令可以是编译、证实或执行特定代码基的命令。当命令被执行时,对应于非模块代码的标识符foo-bar.jar被识别为与关键字“MODULEPATH”相关联的参数。foo-bar.jar的分析指示不存在识别对应于foo-bar.jar的模块的模块描述符。由于缺乏模块描述符,foo-bar.jar被确定为非模块代码。但是,MODULEPATH要求foo-bar.jar的模块化的版本,即,具有模块描述符的foo-bar.jar。由于MODULEPATH要求foo-bar.jar的模块化的版本,因此触发foo-bar.jar的模块化。

在另一个例子中,触发事件包括从开发者接收模块化第一非模块代码的显式命令。该命令可以根据开发者在系统内移动或复制文件来确定。系统被配置为使得,当任何非模块代码被移动或复制(例如,利用图形用户界面或命令行接口)到特定的文件或目录中时,系统触发那个非模块代码的模块化。

在检测到用于模块化非模块代码的触发器之后,确定该非模块代码是否满足模块化的要求(操作204)。如果非模块代码不满足模块化的要求,则确定第一非模块代码不能被模块化(操作206)。

不同的系统可以实现将非模块代码模块化成模块化的代码的不同要求。模块化非模块代码的要求可以包括例如以下中的一个或多个:

(a)要被模块化的非模块代码不能包含任何重复的包

(b)要被模块化的非模块代码不能依赖于受限制的模块代码的特定集合中的任何一个(例如,Java开发工具箱内部的API)

(c)要被模块化的非模块代码不能执行反应性操作,诸如查找其它模块中的类或资源

在一个例子中,被特定代码基依赖的非模块代码的两个不同集合被确定为暴露相同的包。响应于确定非模块代码的两个不同集合暴露相同的包,非模块代码的这两个不同集合不被模块化。

一旦确定要模块化非模块代码,就为该非模块代码生成桥接模块。桥接模块是至少部分地通过为该非模块代码定义命名桥接模块的模块描述符来生成的(操作208)。如果模块描述符是系统定义的,则任何确定性命名惯例都可被用于为桥接模块选择名称。在一个例子中,名称根据对应于被模块化的非模块代码的文件名变化而变化。

一旦已经为非模块代码定义了模块描述符,该非模块代码就可以被称为模块化的代码。因而,模块化非模块代码以获得模块化的代码不必包括对非模块代码本身的任何修改。

如本文所提到的,模块描述符包括对应于关于模块化的代码的信息的声明。声明涉及模块化的代码的使用和功能。各种声明的例子在下面提供,这些不应当被认为是以任何方式限制权利要求的范围。

在一个实施例中,模块描述符声明对应桥接模块对依赖性路径的显式依赖性(操作208a)。在第一个例子中,非模块代码与依赖性路径相关联。具体而言,非模块代码依赖于在依赖性路径中识别出的其它非模块代码。响应于确定非模块代码与依赖性路径相关联,模块描述符声明桥接模块对该依赖性路径的显式依赖性。在第二个例子中,由模块描述符声明的依赖性路径是独立于非模块代码确定的。依赖性路径可以是用于桥接模块的缺省的和/或系统定义的依赖性路径。在第三个例子中,由桥接模块声明的依赖性路径基于非模块代码的依赖性(上面第一个例子)和独立于非模块代码的系统定义的依赖性(上面第二个例子)的组合。在第四个例子中,被模块化的非模块代码依赖于非模块代码的两个或更多个集合。模块描述符包括对非模块代码的两个或更多个集合的第一非模块代码的显式依赖性和/或暴露该第一非模块代码。模块描述符不包括对非模块代码的两个或更多个集合的第二非模块代码的显式依赖性和/或不暴露该第二非模块代码。在另一个例子中,非模块代码依赖于不被特定平台正式支持的另一非模块代码或另一模块。桥接模块不暴露不被特定平台正式支持的非模块代码或另一模块。在另一个例子中,模块描述符包括对与被模块化的非模块代码不使用或要求的非模块代码的至少一个集合对应的依赖性路径的显式依赖性。

模块描述符可以显式地依赖于依赖性路径本身,而不需要参考或识别依赖性路径的参数。模块描述符可以被定义,甚至都不需要检查或识别依赖性路径的参数。模块描述符中所包括的依赖性路径可以指被模块化的非模块代码既不使用也不要求的文件(例如,JAR文件)。

模块描述符中所包括的显式依赖性可以或者可以不暴露给系统内的其它模块。在与Java模块系统相关的例子中,“requires#CLASSPATH”可被用来声明对在CLASSPATH中识别出的参数的依赖,而不向其它模块暴露该参数。作为替代,“requires public#CLASSPATH”可被用来声明对在CLASSPATH中识别出的参数的依赖并且将该参数暴露给其它模块。

在另一个例子中,非模块代码的依赖性可以被递归地确定。非模块代码被分析,以确定非模块代码(直接地或者经由依赖性路径)依赖的第一层次结构层。然后,代码的第一层次结构层被分析,以确定代码的第一层次结构层所依赖的代码的第二层次结构层。该过程递归地重复,直到到达不依赖于任何其它层的基础层。然后,递归确定的依赖性的集合可以作为显式依赖性被包括在模块描述符中。

在实施例中,执行检查,以确保依赖性路径的内容在(a)当桥接模块为包括依赖性路径的非模块代码创建的初始时间和(b)当依赖性路径被访问的稍后时间(在初始时间之后)之间不被修改。具体而言,依赖性路径的内容可以在创建桥接模块时被识别和存储。在稍后的时间,当依赖性路径被访问时,当前内容与存储的内容进行比较。对依赖性路径的内容的任何改变都可以触发报警。

在一个实施例中,模块描述符声明桥接模块对所有其它桥接模块的显式依赖性(操作208b)。在例子中,系统维护已经创建的所有桥接模块的列表。当新的桥接模块通过定义用于非模块代码的模块描述符而被创建时,该新的桥接模块显式依赖于桥接模块的列表中所包括的每个桥接模块。对其它桥接模块的显式依赖性被定义为使得其它桥接模块被暴露给其它模块或非模块代码。在Java模块系统的例子中,“requires public”被用于对其它桥接模块的显式依赖并且向其它模块或非模块代码暴露其它桥接模块。

在一个例子中,所有桥接模块都被配置为显式地依赖于并暴露所有其它桥接模块。当在这种配置中标准模块显式地依赖于桥接模块之一时,所有桥接模块都被暴露给该标准模块。具体而言,由所有桥接模块暴露的所有包都被暴露给该标准模块。

在实施例中,模块描述符声明对每个能够观察到的标准模块、对允许显式依赖性的每个标准模块和/或对由运行时环境确定为执行由标准模块组成的应用所必需的每个标准模块的显式依赖性(操作208c)。在例子中,标准模块暴露可以被其它标准模块、桥接模块和/或非模块代码依赖的包。桥接模块的模块描述符可以声明对暴露包的标准模块的显式依赖性。在另一个例子中,标准模块M具有使用户能够将标准模块M作为应用来运行的入口点。标准模块M要求标准模块N和非模块代码B、JAR文件。此外,标准模块N要求标准模块O。JAR文件被包括在MODULEPATH上,并且因此,运行时环境从JAR文件生成桥接模块B。桥接模块B被设置为要求标准模块M、N和O。如果附加的标准模块P是能够观察到的,但不被标准模块M、N或O当中任何一个要求,则桥接模块B不被设置为要求标准模块P。

在实施例中,模块描述符声明被桥接模块暴露的包(操作208d)。在例子中,系统遍历被模块化的非模块代码的内容。该遍历识别所有可用的包。然后,利用识别这些包的声明,使得这些包可用于被其它部件依赖。

在实施例中,模块描述符声明用于启动应用的执行的入口点(操作208e)。在例子中,文件的集合包括作为用于启动应用的执行的入口点的特定文件。该特定文件可以包括对应于在文件集合中定义的操作集合内的初级操作集合的“主要”方法或其它初级方法。

在实施例中,如以上参照操作208所描述的,定义用于非模块代码的模块描述符导致对应于桥接模块的模块化的代码。桥接模块的模块描述符描述与模块化的代码相关联的声明。

在实施例中,标准模块、桥接模块和非模块代码的组合形成代码基。使用代码基涉及并发地使用标准模块、桥接模块和非模块代码(操作210)。在例子中,代码基可以被编译、证实和/或执行。标准模块可以部分地基于利用非模块代码执行的操作来产生结果。

在实施例中,对应于桥接模块的模块化的代码可以完全地被分析,以确定在模块化的代码外部的被模块化的代码使用和/或要求的实际代码。确定实际代码可以涉及基于代码依赖性来识别代码的完整层次结构的递归的操作集合。桥接模块对依赖性路径的显式依赖性可以被仅对被使用和/或要求的实际代码的显式依赖性代替。

5.示例实施例

在实施例中,操作包括:识别第一非模块代码,其中第一非模块代码不对应于多个模块中任何一个;生成用于第一非模块代码的第一模块;并且其中生成操作包括:定义(a)对应于第一模块并且(b)包括基于与非模块代码的一个或多个集合对应的命名空间的显式依赖性的模块描述符。命名空间可以包括与非模块代码的该一个或多个集合对应的依赖性路径。操作还可以包括:在生成第一模块之前,确定第一非模块代码与命名空间相关联;并且其中定义包括基于命名空间的显式依赖性的模块描述符是响应于确定第一非模块代码与该命名空间相关联的。操作还可以包括:独立于第一非模块代码的任何内容或依赖性,确定要包括在模块描述符中的显式依赖性。在模块描述符中,显式依赖性可以显式地参考命名空间,而不显式地参考与该命名空间对应的非模块代码的该一个或多个集合。模块描述符中的显式依赖性可以显式地参考从与该命名空间对应的非模块代码的该一个或多个集合中选择的第二非模块代码。与该命名空间对应的非模块代码的该一个或多个集合可以包括不被第一非模块代码使用或要求的第二非模块代码,并且其中,在模块描述符中,命名空间允许第一模块访问第二非模块代码,即使第二非模块代码不被第一非模块代码使用或要求。如以上提到的第一模块可以是如本文所述的桥接模块。对应于第一模块的模块描述符可以由系统响应于系统检测到触发事件的发生而定义。操作还可以包括:接收要求第一非模块代码的模块化的命令;并且其中生成用于第一非模块代码的第一模块是响应于接收到该命令的。操作还可以包括:确定第一非模块代码不对应于该多个模块中的任何一个;并且其中生成用于第一非模块代码的第一模块是响应于至少确定第一非模块代码不对应于该多个模块中的任何一个的。操作还可以包括:接收用于执行模块操作的命令,该命令包括第一非模块代码作为参数;并且其中生成用于第一非模块代码的第一模块是响应于接收到该命令。操作还可以包括:接收包括MODULEPATH关键字的命令,其参考用于第一非模块代码的标识符作为参数;并且其中生成用于第一非模块代码的第一模块是响应于接收到该命令的。该多个模块可以包括(a)在显式地依赖于与非模块代码的该一个或多个集合对应的命名空间方面受限制的标准模块的第一集合,和(b)在显式地依赖于与非模块代码的该一个或多个集合对应的命名空间方面不受限制的桥接模块的第二集合。当第一模块是桥接模块时,操作还可以包括:在生成桥之后:利用对桥接模块的显式依赖性成功地证实特定的标准模块;并且其中该特定的标准模块在包括对命名空间的显式依赖性方面受限制。操作还可以包括:基于以下中的一个或多个来定义包括特定显式依赖性的模块描述符:该多个模块中允许由第一模块的显式依赖性的每个模块;该多个模块中对执行由标准模块组成的应用所必需的每个模块;该多个模块中每个能够观察到的标准模块;由开发者列举的每个标准模块;以及除第一模块之外的每个桥接模块。操作还可以包括:定义模块描述符,以允许第一非模块代码中的每个包被标准模块、任何桥接模块和任何非模块代码访问。生成用于第一非模块代码的第一模块可以至少响应于确定:确定第一非模块代码不包含任何重复的包;确定第一非模块代码不依赖于该多个模块中受限制的模块集合中的任何一个;以及确定第一非模块代码不查找在该多个模块中的其它模块中的类或资源。

在实施例中,操作包括:对与该多个模块对应的代码基执行操作,该代码基包括:在包括基于与非模块代码的一个或多个集合对应的命名空间的显式依赖性方面不受限制的第一模块集合;以及在包括基于与非模块代码的该一个或多个集合对应的命名空间的显式依赖性方面受限制的第二模块集合;并且其中第二模块集合当中的至少一个显式地依赖于第一模块集合当中的至少一个。第一模块集合可以由一个或多个桥接模块组成。第二模块集合可以由一个或多个标准模块组成。命名空间可以包括依赖性路径。命名空间可以包括与非模块代码的该一个或多个集合对应的依赖性路径。第一模块集合中的特定模块可以包括模块描述符,其中该模块描述符包括基于与非模块代码的该一个或多个集合对应的命名空间的显式依赖性。

为了清晰,图3A-3D示出了详细的例子。以下描述的部件和/或操作应当被理解为可能不适用于某些实施例的具体例子。因而,以下描述的部件和/或操作不应当被认为限制任何权利要求的范围。此外,该例子不限于给出信息的完整集合。例如,以下仅描述与模块或模块描述符相关联的内容的子集。

在实施例中,图3A示出了非模块系统,其部件被迁移到模块系统。具体而言,非模块系统中的非模块代码被模块化,以生成桥接模块。

代码描述304描述四个文件A.jar 320、B.jar 310、C.jar 330和D.jar 340的特点。A.jar包括类a.AA,B.jar包括类b.BB,C.jar包括类c.CC,并且D.jar包括类d.DD。类a.AA创建b.BB和c.CC的实例,并且相应地依赖于b.BB和c.CC。类c.CC扩展d.DD,并且相应地依赖于d.DD。软件开发环境根据各种文件的需要搜索并加载类。

在初始操作状态T0中,被识别为依赖性路径350的环境变量CLASSPATH包括A.jar、B.jar、C.jar、D.jar。当操作(例如,编译、证实或执行)被执行时,软件开发环境利用CLASSPATH找出所有文件。

在时间T1,示出在D.jar 340的模块化之后的操作状态。D.jar 340的模块化通过将D.jar 340添加到MODULEPATH被触发,如在列表355中示出的。D.jar 340的模块化导致定义基于文件名“D.jar”命名桥接模块D 342的模块描述符。用于桥接模块342的模块描述符还导出d.DD。当对A.jar和C.jar需要时,基于由桥接模块D 342的导出,软件开发环境现在找出d.DD。对于让软件开发环境经由桥接模块D 342的导出函数而不是CLASSPATH找出d.DD,不需要对A.jar 320和C.jar 330的修改。D.jar 340不能利用CLASSPATH被找出,因为D.jar 340已经从CLASSPATH中被移除了。

在时间T2,示出在A.jar 320的模块化之后的操作状态。A.jar 320的模块化通过将A.jar 320添加到MODULEPATH被触发,如在列表355中示出的。A.jar 320的模块化导致定义基于文件名“A.jar”命名桥接模块A 322的模块描述符并且还导出a.AA。如果和在需要时,软件开发环境可以基于由桥接模块A 322的导出而找出a.AA。A.jar 320不能利用CLASSPATH被找出,因为A.jar 320已经从CLASSPATH中被移除了。

在时间T3,示出在添加标准模块360和标准模块370之后的操作状态。标准模块360显式地依赖于桥接模块A 322。当对标准模块360需要时,软件开发环境使用标准模块360的“requires”声明和桥接模块A 322的“exports”声明来识别A.jar 320。标准模块370显式地依赖于桥接模块342。当对标准模块370需要时,软件开发环境使用标准模块370的“requires”声明和桥接模块D 342的“exports”声明来识别D.jar 340。桥接模块(桥接模块A 322和桥接模块D 342)向标准模块导出非模块代码(A.jar 320和D.jar 340)。此外,桥接模块允许标准模块利用未被暴露给标准模块的非模块代码间接地完成操作。具体而言,桥接模块A 322允许标准模块360访问A.jar 320。A.jar 320可以使用B.jar 310和C.jar 330来执行操作,用于获得可以被传递到标准模块360和370的结果。

6.杂项;扩展

实施例针对具有一个或多个设备的系统,其中设备包括硬件处理器并且被配置为执行本文所述和/或在以下任意权利要求中陈述的任何操作。

在实施例中,非瞬时性计算机可读存储介质包括指令,所述指令当被一个或多个硬件处理器执行时,使得本文所述和/或在以下任意权利要求中陈述的任何操作被执行。

在实施例中,操作包括识别第一非模块代码,其中第一非模块代码不对应于多个模块中任何一个;生成用于第一非模块代码的第一模块;并且其中生成操作包括:定义(a)对应于第一模块并且(b)包括基于与非模块代码的一个或多个集合对应的命名空间的显式依赖性的模块描述符。在实施例中,命名空间包括与非模块代码的所述一个或多个集合对应的依赖性路径。在实施例中,操作还包括:在生成第一模块之前,确定第一非模块代码与命名空间相关联;并且其中定义包括基于命名空间的显式依赖性的模块描述符是响应于确定第一非模块代码与该命名空间相关联的。在实施例中,操作还包括:独立于第一非模块代码的任何内容或依赖性,确定要包括在模块描述符中的显式依赖性。在实施例中,模块描述符中的显式依赖性显式地参考命名空间,而不显式地参考与该命名空间对应的非模块代码的该一个或多个集合。在实施例中,在模块描述符中,显式依赖性显式地参考从与该命名空间对应的非模块代码的该一个或多个集合中选择的第二非模块代码。在实施例中,与该命名空间对应的非模块代码的该一个或多个集合包括不被第一非模块代码使用或要求的第二非模块代码,并且其中,在模块描述符中,命名空间允许第一模块访问第二非模块代码,即使第二非模块代码不被第一非模块代码使用或要求。在实施例中,第一模块是桥接模块。在实施例中,对应于第一模块的模块描述符由系统响应于系统检测到触发事件的发生而定义。在实施例中,操作还包括:接收要求第一非模块代码的模块化的命令;并且其中生成用于第一非模块代码的第一模块是响应于接收该命令的。在实施例中,操作还包括:确定第一非模块代码不对应于该多个模块中任何一个;并且其中生成用于第一非模块代码的第一模块是响应于至少确定第一非模块代码不对应于该多个模块中的任何一个的。在实施例中,操作还包括:接收用于执行模块操作的命令,该命令包括第一非模块代码作为参数;并且其中生成用于第一非模块代码的第一模块是响应于接收该命令的。在实施例中,操作还包括:接收包括MODULEPATH关键字的命令,其参考用于第一非模块代码的标识符作为参数;并且其中生成用于第一非模块代码的第一模块是响应于接收该命令的。在实施例中,该多个模块包括(a)在显式地依赖于与非模块代码的该一个或多个集合对应的命名空间方面受限制的标准模块的第一集合,和(b)在显式地依赖于与非模块代码的该一个或多个集合对应的命名空间方面不受限制的桥接模块的第二集合。在实施例中,第一模块是桥接模块,并且其中操作还包括:在生成桥之后:利用对桥接模块的显式依赖性成功地证实特定的标准模块;并且其中该特定的标准模块在包括对命名空间的显式依赖性方面受限制。在实施例中,操作还包括:基于以下中的一个或多个来定义包括特定显式依赖性的模块描述符:该多个模块中允许由第一模块的显式依赖性的每个模块;该多个模块中对执行由标准模块组成的应用所必需的每个模块;该多个模块中每个能够观察到的标准模块;由开发者列举的每个标准模块;以及除第一模块之外的每个桥接模块。在实施例中,操作还包括:定义模块描述符,以允许第一非模块代码中的每个包被标准模块、任何桥接模块和任何非模块代码访问。在实施例中,生成用于第一非模块代码的第一模块至少响应于确定:确定第一非模块代码不包含任何重复的包;确定第一非模块代码不依赖于该多个模块中受限制的模块集合中任何一个;以及确定第一非模块代码不查找在该多个模块中其它模块中的类或资源。

在实施例中,操作包括:对与该多个模块对应的代码基执行操作,该代码基包括:在包括基于与非模块代码的一个或多个集合对应的命名空间的显式依赖性方面不受限制的第一模块集合;以及在包括基于与非模块代码的该一个或多个集合对应的命名空间的显式依赖性方面受限制的第二模块集合;并且其中第二模块集合当中的至少一个显式地依赖于第一模块集合当中的至少一个。在实施例中,第一模块集合由一个或多个桥接模块组成。在实施例中,第二模块集合由一个或多个标准模块组成。在实施例中,命名空间包括依赖性路径。在实施例中,命名空间包括与非模块代码的该一个或多个集合对应的依赖性路径。在实施例中,第一模块集合中的特定模块包括模块描述符,其中该模块描述符包括基于与非模块代码的该一个或多个集合对应的命名空间的显式依赖性。

本文所述的特征和功能的任意组合可以根据一个或多个实施例被使用。在前面的说明书中,已经参照众多细节描述了实施例,这些细节可以随实现而变。因而,说明书和附图应当在说明性而不是限制性的意义上考虑。本发明范围的唯一且排他指示,以及申请人预期要作为本发明范围的内容,是由本申请产生的权利要求集合的按照这种权利要求产生的具体形式的字面和等效范围,包括任何后续的校正。

7.硬件概述

根据一个实施例,本文所描述的技术由一个或多个专用计算设备实现。专用计算设备可以是硬连线的以执行所述技术,或者可以包括诸如被永久性地编程以执行所述技术的一个或多个专用集成电路(ASIC)或现场可编程门阵列(FPGA)的数字电子设备,或者可以包括编程为按照固件、存储器、其它存储装置或者其组合中的程序指令来执行所述技术的一个或多个通用硬件处理器。这种专用计算设备还可以合并定制的硬连线逻辑、ASIC或FPGA与定制的编程来实现所述技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持式设备、联网设备或者结合硬连线和/或程序逻辑来实现所述技术的任何其它设备。

例如,图4是示出本发明的实施例可以在其上实现的计算机系统400的框图。计算机系统400包括总线402或者用于传送信息的其它通信机制,以及与总线402耦合用于处理信息的硬件处理器404。硬件处理器404可以是例如通用微处理器。

计算机系统400还包括耦合到总线402用于存储信息和要由处理器404执行的指令的主存储器406,诸如随机存取存储器(RAM)或其它动态存储设备。主存储器406还可以用于在要由处理器404执行的指令执行期间存储临时变量或其它中间信息。当存储在处理器404能够访问的非瞬时性存储介质中时,这种指令使计算机系统400变成为被定制以执行指令中所指定的操作的专用机器。

计算机系统400还包括只读存储器(ROM)408或者耦合到总线402的其它静态存储设备,用于为处理器404存储静态信息和指令。诸如磁盘或光盘的存储设备410被提供并且耦合到总线402,用于存储信息和指令。

计算机系统400可以经由总线402耦合到显示器412,诸如阴极射线管(CRT),用于向计算机用户显示信息。输入设备414,包括字母数字和其它键,耦合到总线402,用于向处理器404传送信息和命令选择。另一种类型的用户输入设备是游标控件416,诸如鼠标、轨迹球或者游标方向键,用于向处理器404传送方向信息和命令选择并且用于控制显示器412上的游标运动。这种输入设备通常具有在两个轴——第一个轴(例如,x)和第二个轴(例如,y)——中的两个自由度,以允许设备在平面内指定位置。

计算机系统400可以利用定制的硬连线逻辑、一个或多个ASIC或FPGA、固件和/或程序逻辑来实现本文所述的技术,这些与计算机系统相结合,使计算机系统400成为或者把计算机系统400编程为专用机器。根据一个实施例,本文的技术由计算机系统400响应于执行包含在主存储器406中的一条或多条指令的一个或多个序列的处理器404而执行。这种指令可以从诸如存储设备410的另一存储介质读到主存储器406中。包含在主存储器406中的指令序列的执行使处理器404执行本文所述的过程步骤。在可替代的实施例中,硬连线的电路系统可以代替软件指令或者与其结合使用。

如在本文所使用的,术语“存储介质”指存储使机器以特定方式操作的数据和/或指令的任何非瞬时性介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘或磁盘,诸如存储设备410。易失性介质包括动态存储器,诸如主存储器406。存储介质的常见形式包括,例如,软盘、柔性盘、硬盘、固态驱动器、磁带或者任何其它磁性数据存储介质、CD-ROM、任何其它光学数据存储介质、任何具有孔模式的物理介质、RAM、PROM和EPROM、FLASH-EPROM、NVRAM、任何其它存储器芯片或盒式磁带。

存储介质与传输介质截然不同但是可以与其结合使用。传输介质参与在存储介质之间传送信息。例如,传输介质包括同轴电缆、铜线和光纤,包括包含总线402的配线。传输介质还可以采取声或光波的形式,诸如在无线电波和红外线数据通信中产生的那些。

各种形式的介质可以涉及把一条或多条指令的一个或多个序列携带到处理器404供执行。例如,指令最初可以在远程计算机的磁盘或固态驱动器上携带。远程计算机可以把指令加载到其动态存储器中并且利用调制解调器经电话线发送指令。位于计算机系统400本地的调制解调器可以在电话线上接收数据并且使用红外线发送器把数据转换成红外线信号。红外线检测器可以接收在红外线信号中携带的数据并且适当的电路系统可以把数据放在总线402上。总线402把数据携带到主存储器406,处理器404从主存储器406检索并执行指令。由主存储器406接收到的指令可以可选地在被处理器404执行之前或之后存储在存储设备410上。

计算机系统400还包括耦合到总线402的通信接口418。通信接口418提供耦合到网络链路420的双向数据通信,其中网络链路420连接到本地网络422。例如,通信接口418可以是综合业务数字网络(ISDN)卡、电缆调制解调器、卫星调制解调器,或者提供到对应类型电话线的数据通信连接的调制解调器。作为另一个例子,通信接口418可以是提供到兼容的局域网(LAN)的数据通信连接的LAN卡。也可以实现无线链路。在任何此类实现中,通信接口418发送和接收携带表示各种类型的信息的数字数据流的电信号、电磁信号或光信号。

网络链路420通常通过一个或多个网络向其它数据设备提供数据通信。例如,网络链路420可以通过本地网络422提供到主机计算机424或者到由互联网服务提供商(ISP)426运营的数据装备的连接。ISP 426又通过现在通常称为“互联网”428的全球分组数据通信网络提供数据通信服务。本地网络422和互联网428两者都使用携带数字数据流的电信号、电磁信号或光信号。通过各种网络的信号以及在网络链路420上并通过通信接口418的信号是传输介质的示例形式,其中这些信号把数字数据携带到计算机系统400或者携带来自计算机系统400的数字数据。

计算机系统400可以通过(一个或多个)网络、网络链路420和通信接口418发送消息和接收数据,包括程序代码。在互联网例子中,服务器430可以通过互联网428、ISP 426、本地网络422和通信接口418发送对应用程序的请求代码。

接收到的代码可以由处理器404在它被接收到时执行、和/或存储在存储设备410或其它非易失性存储装置中,用于以后执行。

在前面的说明书中,已经参照众多细节描述了本发明的实施例,这些细节可以随实现而变。因而,说明书和附图应当在说明性而不是限制性的意义上考虑。本发明范围的唯一且排他指示,以及申请人预期要作为本发明范围的内容,是由本申请产生的权利要求集合的按照这种权利要求产生的具体形式的字面和等效范围,包括任何后续的校正。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1