掌桥专利:专业的专利平台
掌桥专利
首页

使用虚拟工件的字节码转换

文献发布时间:2023-06-19 13:26:15


使用虚拟工件的字节码转换

技术领域

本公开的各方面涉及使用虚拟工件的字节码转换。

背景技术

开发软件时,应用程序可能需要不同类型的文件才能执行。例如,一个应用程序可以包括一个或多个文件,它们含有指示在执行该应用程序时所采取的动作的代码(例如,源代码、字节码)。应用程序还可以包括其他类型的文件,诸如含有正确执行应用程序所需的配置、数据、图像或其他信息的文件。

发明内容

本公开提出了用于执行字节码转换的新的和创新的系统和方法。在一个方面中,提供了一种方法,其包括接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码,并在该源代码内标识第一虚拟工件。该方法可以进一步包括确定本地存储库没有存储第一虚拟工件,并且从集中式存储库中检索与第一虚拟工件相对应的真实工件。该方法还可以包括,将字节码转换应用于真实工件以生成第二字节码,并将第二字节码添加到第一字节码。

在另一方面中,提供了一种包括处理器和存储器的系统。存储器可以存储指令,它们在由处理器执行时使处理器接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码,在源代码中标识第一虚拟工件,并基于第一虚拟工件生成第二字节码。这些指令还可以使处理器确定第一虚拟工件具有依赖关系,并标识依赖关系内的第二虚拟工件。这些指令还可以使处理器基于第二虚拟工件生成第三字节码,并将第二字节码和第三字节码添加到第一字节码。

本文描述的特征和优点不是全部包含的,并且特别地,鉴于附图和描述,许多其他特征和优点对于本领域的普通技术人员将是显而易见的。此外,应当注意,说明书中使用的语言主要是出于可读性和指导性目的而进行选择的,而不是为了限制所公开主题的范围。

附图说明

图1图示根据本公开的示例性实施例的系统。

图2图示根据本公开的示例性实施例的依赖关系映射。

图3图示根据本公开的示例性实施例的用于使用虚拟工件来生成字节码的方法。

图4图示根据本公开的示例性实施例的用于利用存储的虚拟工件的方法。

图5图示根据本公开的示例性实施例的用于生成应用字节码的方法的流程图。

图6图示根据本公开的示例性实施例的用于处理工件依赖关系的方法。

图7图示根据本公开的示例性实施例的系统。

具体实施方式

在某些实现中,应用程序可能需要被转换或以其他方式被更改以正确执行。转换存档可能会更改应用程序的字节码。可以执行转换,例如来配置用于在特定计算环境内执行的应用。例如,可以首先准备应用程序并将其配置为在特定操作系统或操作系统版本(例如,Red

通常,为了执行此类转换,可以使用诸如ASM、Javassist和Byte Buddy之类的转换工具来创建个性化转换,所述个性化转换标识了可以对特定类型的数据执行的转换类型。例如,可以创建转换,以将配置为在一个操作系统中执行的字节码转换为可以在不同操作系统中执行的字节码。作为另一个示例,可以创建单独的转换,以将配置为在

因此,存在一种系统,该系统能够检测何时需要字节码转换并且在必要时应用转换。此外,这种系统应该能够执行字节码转换,作为生成应用程序的字节码的一部分。该问题的一种解决方案是提供能够检测源代码内的工件的构建环境。这些工件可以包括与存储在集中式存储库(例如,多个构建环境可访问的存储库)内的字节码相对应的真实工件。分类器还可被配置为标识虚拟工件,其可对应于需要字节码转换的源代码行。在某些情况下,可以将与虚拟工件相对应的字节码(例如,先前已经基于相似或相同的源代码行来转换的字节码)存储在构建环境的本地存储库中。在此类情况下,构建环境可以检索相应的字节码。在其他情况下,可能需要生成虚拟工件的转换的字节码。例如,构建环境可以标识集中式存储库中的相应真实工件,并且可以检索与真实工件相关联的字节码。然后,构建环境可以将字节码转换应用于检索到的字节码,以生成转换的字节码以供执行。

图1图示根据本公开的示例性实施例的系统100。系统100可以被配置为使用真实工件和虚拟工件来构建应用字节码。系统100包括构建环境102、本地存储库104和集中式存储库106。构建环境102可以被配置为接收和处理构建请求110以生成用于执行(例如,由计算系统和/或在云计算环境内执行)的应用字节码116。特别地,构建环境102可以接收指定源代码112的构建请求110。例如,构建环境102可以至少部分地由IDE(例如,作为IDE的扩展)来实现。可以在IDE内创建和/或编辑源代码112。在此类情况下,构建请求110可以由IDE接收(例如,从IDE的用户)。在另外的或替代的实现中,可以从诸如与用户(例如,创建或正在请求部署源代码112的用户)相关联的计算设备的另一计算设备接收构建请求110。例如,构建环境102可以包括配置为从多个计算设备(例如,在多个计算设备上执行的IDE)接收构建请求110的网络代理。源代码112可以包含在构建请求110内和/或可以存储在其他地方(例如,在另一个计算设备上、在存储设备上、在数据库中、在云计算系统上)。

源代码112含有多个行118、120、122、124。每行可以含有以特定编程语言(例如

集中式存储库106可以存储从多个构建环境接收的真实工件152、154。例如,集中式存储库106可以存储从与多个计算域和/或多个组织相关联的构建环境接收的真实工件152、154。集中式存储库106可以接收真实工件和相应的数据,以在构建应用程序时使用。例如,存储在集中式存储库106内的真实工件152、154中的一些真实工件可以包括先前已经被编译以执行的相应字节码156、158。作为特定示例,真实工件152可以对应于先前已经被编译成字节码156的函数调用或API调用。在检测到源代码内的真实工件152(例如,函数调用或API调用)之后,可以从集中式存储库106中检索对应的字节码156,并将其添加到应用字节码以执行。在某些实现中,集中式存储库106可以被实现为

类似于集中式存储库106,本地存储库104可以存储与用于构建应用程序的数据相关联的工件。但是,本地存储库104可以存储虚拟工件148、150,而不是存储真实工件152、154。例如,与集中式存储库106不同,本地存储库104可能不是集中可访问的(例如,可能不是公共可访问的,可能是特定组织外部的计算设备不可访问的)。如下面进一步解释的,虚拟工件148、150可以表示先前被转换然后被添加到本地存储库104中的字节码160、162。例如,虚拟工件148、150可以表示从本地存储库104中检索已转换的字节码的命令。作为特定示例,虚拟工件148可以对应于Java企业版函数调用,其先前已转换为用于对相应的Jakarta EE函数的函数调用的字节码160。

为了标识真实工件126、128和虚拟工件130、132,分类器114可以利用一个或多个关键字。例如,工件可具有对应名称、ID号等,其可用于标识源代码112的行内的工件。例如,分类器114可包括用于工件(例如,用于源代码112的行118、120、122、124)的查找表,所述工件对应于与真实工件126、128和/或虚拟工件130、132相关联地存储的先前生成的字节码。在某些实现中,分类器114可以实现为多于一个分类器。例如,在某些实现中,可以使用单独的分类器来标识源代码112内的真实工件126、128和虚拟工件130、132。作为一个具体的示例,为了标识虚拟工件130、132,可以定义Jakarta分类器,其包括对Java企业版命名空间内的函数的调用的虚拟工件,这些调用需要转换为对Jakarta EE命名空间内的函数的相应调用。可以使用与源代码112(未示出)相关联的项目对象模型,在构建环境102内添加另外的分类器(例如,可以将其添加到分类器114)。例如,为了将Jakarta分类器添加到分类器114,可以通过将$jakarta$添加到项目对象模型来调用Jakarta分类器。

在检测到源代码112中的真实工件126、128之后,构建环境102可以从集中式存储库106检索与所标识的真实工件126、128对应的字节码136、140。所检索的字节码136、140可以添加到应用字节码116中。在检测到虚拟工件130、132时,构建环境可以查询本地存储库104,以确定本地存储库104是否存储与所标识的虚拟工件130、132关联的字节码。如果确定本地存储库104存储了与标识的虚拟工件相对应的字节码,则可以从本地存储库104检索该字节码并将其添加到应用字节码116。例如,本地存储库104可以存储与字节码138相关联的虚拟工件130。因此,在检测到源代码112内的虚拟工件130时,构建环境102可以从本地存储库104检索字节码138,并将字节码138添加到应用字节码116。如果虚拟工件的相应字节码未与本地存储库104一起存储,则构建环境可以生成字节码来添加到应用字节码116。在某些情况下,构建环境102可以直接基于相应的行来生成字节码。例如,虚拟工件132可能没有存储在本地存储库104内。因此,构建环境102可以基于源代码112的行124直接生成字节码。在行124包括需要一次或多次转换的指令的情况下,在生成字节码之前,构建环境102可以将转换应用于行124中指定的指令。另外地或替代地,构建环境102可以在生成字节码之后应用字节码转换134。在更进一步的情况下,分类器114可以确定行124也对应于存储在中央存储库106内的真实工件。在此类情况下,代替基于行124生成新的字节码,构建环境102可以从集中式存储库106检索相应的字节码,并且可以将字节码转换134应用于检索到的字节码。在以上任何示例中,字节码转换134可以是被标识的分类器114。例如,字节码转换134可以对应于分类器114和/或可以对应于分类器114内的特定虚拟工件。

构建环境102包括处理器144和存储器146。处理器144和存储器146可以实现构建环境102的一个或多个方面。例如,存储器146可以存储当由处理器144执行时可能使处理器144执行构建环境102的一个或多个操作特性的指令。处理器144可以实现为一个或多个中央处理单元(CPU)、现场可编程门阵列(FPGA)和/或图形处理单元(GPU),它们被配置为使用存储在存储器146上的执行指令。另外,构建环境102可以被配置为使用网络108与集中式存储库106和/或与其他计算设备通信(例如,接收构建请求110)。例如,构建环境102可以使用一个或多个有线网络接口(例如,以太网接口)和/或无线网络接口(例如,

此外,本地存储库104和/或集中式存储库106可以由一个或多个计算设备实现。例如,尽管未示出,但是本地存储库104和集中式存储库106中的一个或多个可含有实现至少一个操作特征的处理器和存储器。例如,存储器可以含有指令,它们在由处理器执行时使处理器实现本地存储库104和/或集中式存储库106的至少一个操作特征。

在某些情况下,本地存储库104可以由除实现构建环境102的计算设备以外的计算设备来实现。例如,本地存储库104中的构建环境102可以经由使用一个或多个有线或无线网络接口的本地网络进行通信。在另外或替代实现中,构建环境102可以至少部分地实现本地存储库104。例如,构建环境102可以将本地存储库104维护为虚拟工件148、150和对应的字节码160、162的本地缓存。

图2图示根据本公开的示例性实施例的依赖关系映射200。依赖关系映射200可以表示构建环境102通过其检测源代码112内需要转换以生成适当的应用字节码116的依赖关系的过程。依赖关系可以包括源代码112内的行,所述行包括对源代码112外部的其他函数或应用编程接口(API)的调用。例如,源代码112内的一行可以包括对依赖于Java企业版较旧版本的函数的调用(例如,包括基于Java企业版命名空间,而不是Jakarta EE命名空间而预备的行的函数)。当源代码112依赖于尚未被更新或在可预见的将来可能不会被更新的函数库时,可能会出现此类情况。开发人员可能无法访问此类库内的函数的底层源代码,因此可能无法自行更改函数调用。然而,开发者可能仅能够访问函数(例如,作为存储在集中式存储库106中的工件)的可执行版本(例如,字节码版本)。因此,在将这些函数的字节码添加到应用字节码116之前,可能需要对其进行转换。

可以基于与源代码112对应的项目对象模型来标识源代码112中的依赖关系。例如,项目对象模型可以包括对尚未更新的库202的调用(即“oldlib”)。作为特定示例,项目对象模型可以通过声明以下内容来指示使用了库202:

com.old

oldlib

1.0

该调用可以指定源代码112依赖于具有组ID“com.old”的oldlib库202的版本1.0。可以分析源代码112的行,它们包括对oldlib库202内的一个或多个函数的调用。例如,oldlib库202内的函数可以被称为“oldlib.function()”,其中“function”代表函数的名称并且函数的任何参数被包括在括号之间。依赖关系可能被检测为含有对其他库的此类函数调用的行。在一个这样的示例中,行124可以包括对oldlib库202函数的调用。

在检测到行124的依赖关系之后,构建环境102可以处理依赖关系(例如,行124调用的库202和/或函数)。构建环境102可以分析库202内的被调用函数的行,以确定是否有任何行对应于需要字节码转换的虚拟工件。例如,分类器114可以针对库202内的函数,分析源代码的行或字节码的行,以检测虚拟工件。在一个这样的情况下,分类器114可以确定该函数的至少一行206对应于虚拟工件210。可以重复该过程。例如,行206可以调用另一个库204中的另一个函数。可以通过分类器114分析与该函数相对应的行,并且可以标识与虚拟工件212相对应的行208。可以重复该过程,直到已经分析了行124的所有依赖关系为止。类似地,可以对源代码112内包括依赖关系的所有行重复上述过程。

一旦检测到,就可以如以上所讨论地那样处理虚拟工件132、210、212(例如,通过从本地存储库104检索相应的字节码和/或通过使用相应的字节码转换134来转换字节码),以生成转换的字节码142、214、216,以包含在应用字节码116内。在某些情况下,当虚拟工件132、210、212在行124、206、208中被标识时,它们可以被处理为转换的字节码142。在另外的或替代的实现中,分类器114和构建环境102可以完成检测所有的虚拟工件132、210、212(例如,用于行124的依赖关系的所有虚拟工件和/或源代码112内的所有行和所有依赖关系的所有虚拟工件),然后可以生成相应的转换的字节码142、214、216。

类似的技术也可以用于对应于真实工件126、128的行118、122。例如,真实工件126、128中的一个或多个可以对应于包括来自其他库202、204的依赖关系的字节码。因此,对于与虚拟工件相对应的依赖关系,可以类似地分析从集中式存储库106检索的字节码136、140的行。

图3图示根据本公开的示例性实施例的用于使用虚拟工件而生成字节码的方法300。方法300可以在计算机系统(例如系统100)上实现。例如,方法300可以由构建环境102、本地存储库104和/或集中式存储库106实现。方法300还可以由存储在计算机可读介质上的指令集实现,当该指令集由处理器执行时,使计算机系统执行方法300。例如,方法300的全部或部分可以由处理器144和存储器146实现。尽管下面讨论的示例是参考图3中所示的流程图描述的,但是可以使用执行与图3相关联的动作的许多其他方法。例如,某些框的顺序可以改变,某些框可以与其他框组合,一个或多个框可以重复,并且所描述的一些框可以是可选的。

方法300可以从接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码开始(框302)。例如,构建环境102可以从另一计算设备接收构建请求110。构建请求110可以为将被转换为应用字节码116的应用程序指定源代码112,所述应用字节码116可以用于执行该应用程序。

可以在源代码内标识第一虚拟工件(框304)。例如,构建环境102可以检测源代码112内的虚拟工件132。具体地,虚拟工件132可以由分类器114标识。源代码112可以包括代码的一行或多行118、120、122、124,其将被转换为应用字节码116的字节码。分类器114可以配置为分析行118、120、122、124,以标识包括真实工件126、128和虚拟工件130、132的工件。具体地,分类器114可以包括单独的分类器以检测虚拟工件130、132。通过使用单独的分类器,分类器114可以检测行124内的虚拟工件132。具体地,可以基于行124内的函数调用、API调用等来检测虚拟工件。在一个特定示例中,124可包括对Java企业版(例如,“javax”)函数的调用,以创建servlet函数,即“javax.servlet.Servlet”。可以标识对应于Java企业版函数调用的虚拟工件132。例如,如上所述,Java企业版函数调用可能不再被支持在应用字节码中使用,因此可以将其添加到分类器114(例如$jakarta$分类器),以标识为虚拟工件132。

可以确定本地存储库不存储第一虚拟工件(框306)。例如,响应于标识虚拟工件132,构建环境102可以查询本地存储库104以确定虚拟工件132和对应的字节码是否存储在本地存储库104内。构建环境102可以接收指示虚拟工件132未存储在本地存储库104内的响应。因此,构建环境102可以确定需要为虚拟工件132生成转换的字节码。

可以从集中式存储库中检索与第一虚拟工件相对应的真实工件(框308)。例如,构建环境102可以从集中式存储库106中检索与虚拟工件132相对应的真实工件。作为特定示例,真实工件154可以与对用于创建服务器套接字的Java函数(即,“javax.servlet.Servlet”)的调用相对应。因此,可以执行与真实工件154相对应的字节码158,以在过时的Java企业版环境中实现或调用该函数。构建环境102可以从集中式存储库106检索字节码158(例如,经由网络108)。

可以将字节码转换应用于真实工件以生成第二字节码(框310)。例如,构建环境102可以将字节码转换134应用于与真实工件154相关联的字节码158。应用字节码转换134可以生成转换的字节码142(例如,第二字节码)。如上所述,字节码转换134可以对应于分类器114和/或特定类型的虚拟工件132。继续前面的示例,字节码转换134可以被配置为将对Java企业版函数的调用转换为等效Jakarta EE函数的调用。例如,字节码转换134可以在字节码158内用“jakarta.servlet.Servlet”函数调用来替换“javaxservlet.Servlet”函数调用。在以上示例中,假定了Java企业版和Jakarta EE命名空间具有类似的结构。但是,在其他示例中,命名空间可能具有不同的结构。例如,在此类情况下,字节码转换134可以将“javax.servlet.Servlet”函数调用替换为“jakartaservlet.Servlet”函数调用。因此,字节码转换134可以包括在特定部分之间的一个或多个映射,它们是Java企业版命名空间的子集和Jakarta命名空间的对应部分。在另外的或替代的实现中,字节码转换134可以包括进一步的代替。例如,在执行字节码转换以更新或改变由接收集中式存储库的字节码实现的函数的功能的情况下,字节码转换134可以重写或替换字节码的一个或多个功能行。

第二字节码可以被添加到第一字节码(框312)。例如,在生成转换的字节码142之后,构建环境102可以将转换的字节码142添加到应用字节码116。在某些情况下,转换的字节码142可以存储在本地存储库104内。虚拟工件132的指示(例如,组ID和工件名称)可以与转换的字节码142相关联地存储在本地存储库104中,以用于处理含有虚拟工件132的源代码112和其他源代码内的另外的行。另外地或替代地,构建环境102可以将转换的字节码142添加到集中式存储库106中。

在方法300中,假定第一虚拟工件没有在本地存储库104内存储的相应的字节码。但是,在某些情况下,由分类器114标识的虚拟工件130可包括存储在本地存储库104中的相应字节码。在此类情况下,虚拟工件的处理可能与方法300不同。

具体地,图4图示根据本公开的示例性实施例的用于利用存储的虚拟工件的方法400。可以对方法300进行至少一部分的补充或替代,来执行方法400。例如,可以在框304标识第一虚拟工件之后执行方法400。方法400可以在计算机系统上实现,诸如系统100。例如,方法400可以由构建环境102、本地存储库104和/或集中式存储库106实现。方法400还可以由存储在计算机可读介质上的指令集实现,该指令集由处理器执行时,使计算机系统执行方法400。例如,方法400的全部或部分可以由处理器144和存储器146实现。尽管下面讨论的示例是参考图4中所示的流程图描述的,但是可以使用执行与图4相关联的动作的许多其他方法。例如,某些框的顺序可以改变,某些框可以与其他框组合,一个或多个框可以重复,并且所描述的一些框可以是可选的。

方法400可以从确定本地存储库存储了第一虚拟工件开始(框402)。例如,构建环境102可以查询本地存储库104,并确定本地存储库104存储了与虚拟工件130相对应的字节码。如上所述,由分类器114标识的工件可以包括组ID和工件名中的一个或多个。虚拟工件130可以基于组ID和工件名中的一个或两者与本地存储库一起标识。

可以在本地存储库中检索与第一虚拟工件相对应的第三字节码(框404)。例如,构建环境102可以从本地存储库104请求与虚拟工件130相对应的字节码138,并且可以从本地存储库104接收字节码138。第三字节码可以被添加到第一字节码(框406)。例如,构建环境102可以将从本地存储库104接收的字节码138添加到应用字节码116。

方法300、400可以使环境102能够使用工件根据需要执行字节码转换。此外,可以使用现有的工件结构和机制来执行和协调字节码转换(例如,在IDE内)。具体地,通过使用虚拟工件以检测何时需要转换字节码并协调执行哪些字节码,转换方法300、400使能现有工件结构和构建工具的扩展。以这种方式,方法300、400可以确保所生成的应用字节码的兼容性,而不必向应用程序的构建和部署管道添加另外的工具。此外,通过使用本地存储库104来检索先前转换的字节码,因为避免了冗余转换,所以方法300、400减少了转换字节码所需的处理时间。

还应注意,尽管本文讨论的许多示例着重于将字节码从Java企业版调用转换为Jakarta EE调用,但该技术可类似地用于确保字节码兼容性。作为特定示例,其他改变(例如,对网络配置、操作系统要求等)可能使应用程序使用的库的一个版本与应用程序不兼容,或与应用程序使用的另一库不兼容。在此类情况下,字节码转换可以应用于更新配置和/或调整不兼容库的操作。在另一个示例中,可以改变在源代码内调用的函数(例如,名称和/或输入的改变)。在此类情况下,可以在构建时(例如,使用字节码转换)检测并更新对函数的调用,以确保函数调用是最新的。

图5示出了根据本公开的示例性实施例的用于转换字节码的方法的流程图500。该方法可以由计算系统执行,诸如系统100。例如,流程图500包括构建环境502,其可以是构建环境102的示例性实现;本地存储库504,其可以是本地存储库104的示例性实现;以及集中式存储库506,其可以是集中式存储库106的示例性实现。方法还可以由存储在计算机可读介质上的指令集实现,该指令集由处理器执行时,使计算机系统执行所述方法。例如,该方法的全部或部分可以由处理器144和存储器146实现。尽管下面讨论的示例是参考图5中所示的流程图描述的,但是可以使用执行与图5相关联的动作的许多其他方法。例如,某些框的顺序可以改变,某些框可以与其他框组合,一个或多个框可以重复,并且所描述的一些框可以是可选的。

该方法可以开始于构建环境502接收构建请求(框510)。构建请求可以指定要转换为用于执行的应用字节码的源代码。可以在源代码内标识虚拟工件(框512)。例如,虚拟工件可以由构建环境502的分类器标识,并且可以对应于源代码内可能需要被转换的行(例如,以确保兼容性)。响应于标识虚拟工件,构建环境502可以从本地存储库504请求与虚拟工件相对应的字节码(框514)。

本地存储库504可以确定与虚拟工件相对应的字节码是否与本地存储库504一起存储(框516)。例如,本地存储库504可以确定是否已经将具有相同组ID和/或工件名的虚拟工件添加到本地存储库504。如果在本地存储库504内存储了相应的字节码,则本地存储库504可以发送相应的字节码(框518)。构建环境502可以接收相应的字节码(框520),并且可以将相应的字节码添加到应用字节码(框522)。例如,构建环境502可以执行与以上结合方法400所讨论的技术类似的技术,以将对应的字节码添加到应用字节码。

如果本地存储库504没有存储相应的字节码,则构建环境502可以从集中式存储库506请求与真实工件相对应的字节码(框524)。具体地,构建环境502可以请求用于与虚拟工件相对应的真实工件的字节码。然后,集中式存储库可以发送相应的字节码(框526),并且构建环境可以接收相应的字节码(框528)。然后,构建环境502可以将字节码转换应用于相应的字节码(框530)。例如,构建环境502可以应用与虚拟工件相对应的字节码转换以生成转换的字节码。可以将转换的字节码添加到应用字节码(框532)。例如,构建环境502可以将转换的字节码添加到响应于接收到的构建请求而生成的应用字节码。

该方法可以使构建环境能够响应性地标识哪些虚拟工件先前已经被转换。具体地,该方法可以使构建环境502能够确定本地存储库何时已经存储了相应的字节码,并在可能的情况下利用先前存储的字节码,以减少响应构建请求生成和转换应用字节码所需的处理时间。此外,即使当本地存储库未存储相应的字节码时,构建环境502也可以从集中式存储库506检索并转换字节码。这可能进一步降低构建环境502需要从头开始生成虚拟工件的字节码的频率。因此,这些技术增加了字节码生成的响应性,同时在确保兼容性的必要情况下仍能够进行字节码的转换。

图6示出了根据本公开的示例性实施例的用于处理工件依赖关系的方法600。方法600可以在计算机系统上实现,诸如系统100。例如,方法600可以由构建环境102、本地存储库104和/或集中式存储库106实现。方法600还可以由存储在计算机可读介质上的指令集实现,该指令集由处理器执行时,使计算机系统执行方法600。例如,方法600的全部或部分可以由处理器144和存储器146实现。尽管下面讨论的示例是参考图6中所示的流程图描述的,但是可以使用执行与图6相关联的动作的许多其他方法。例如,某些框的顺序可以改变,某些框可以与其他框组合,一个或多个框可以重复,并且所描述的一些框可以是可选的。

方法600可以从接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码开始(框602)。可以在源代码内标识第一虚拟工件(框604)。可以基于第一虚拟工件来生成第二字节码(框606)。可以使用与结合方法300、400的以上所讨论的技术类似的技术来实现框602-606。例如,可以以与结合框302的以上所讨论的技术类似的技术来实现框602,并且可以以与结合框304的以上所讨论的技术类似的技术来实现框604。此外,可以使用与结合框306-312和/或框402-406的以上所讨论的技术类似的技术来实现框606。

可以确定第一虚拟工件具有依赖关系(框八)。例如,构建环境102可以确定第一虚拟工件130、132具有依赖关系。具体地,可以确定对应于第一虚拟工件132的源代码112的行124具有依赖关系。如上所述,可以基于与源代码112和/或行124内的函数代码相对应的项目对象模型来标识依赖关系。在一个示例中,可以为服务器上操作为servlet函数的应用程序接收源代码112。可以将应用程序和源代码112配置为使用Jakarta EE servlet API。但是,该应用程序仍可能依赖于利用Java企业版servlet API的库202,并且开发人员可能无法访问该库的源代码。在此类情况下,行124可以调用库202内的函数,因此可以被标识为与行124相对应的第一虚拟工件的依赖关系。

可以在依赖关系内标识第二虚拟工件(框610)。例如,构建环境102可以在依赖关系内标识第二虚拟工件210。在某些情况下,如上所述,分类器114可以分析相应库202内的源代码或字节码的行的依赖关系。虚拟工件210可以被标识为需要转换的依赖关系的行206内的函数调用(例如,对过时的Java企业版servlet API的函数调用)。

可以基于第二虚拟工件来生成第三字节码(框612)。例如,构建环境102可以基于行206来生成第三字节码214。具体地,可以使用与用于基于虚拟工件130、132来生成用于源代码112的第二字节码138、142的技术类似的技术,生成第三字节码214。具体地,可以通过至少部分地执行方法300(例如,框306-310)和/或方法400(例如,框402-404)来生成第三字节码214。继续前面的示例,可以生成第三字节码214,以将对过时的Java企业版servletAPI的函数调用转换为对Jakarta EE servlet API的函数调用。

第二字节码和第三字节码可以被添加到第一字节码(框614)。例如,第二字节码142和第三字节码214可以被添加到应用字节码116。在某些情况下,在生成第三字节码之后,通过使用与联系存储转换的字节码142在上面讨论的技术类似的技术,构建环境102可以将第三字节码与第二虚拟工件210的标识符相关联地存储在本地存储库104内。在某些实现中,诸如在依赖关系映射200中描述的那些,源代码112所依赖的函数或库202可以具有对另一个库204的额外依赖关系。在此类情况下,可以至少部分地重复方法600,以处理和生成用于该额外依赖关系的字节码。例如,可以重复框608-612,以标识并生成用于源代码112的依赖关系的至少一个子集的字节码。

以这种方式,方法600使得上面讨论的字节码转换技术能够检测和说明源代码112内的依赖关系和源代码112所利用的其他库。因此,即使当用于依赖关系的源代码不可用时,方法600也允许执行字节码转换,从而可以确保库和其他函数的兼容性,即使这些函数本身已过时。

图7图示根据本公开的示例性实施例的系统700。系统700包括处理器702和存储器704。存储器704可以存储指令706。当由处理器702执行时,指令706可以使处理器702接收构建请求708以将应用程序712的源代码710转换为应用程序712的第一字节码714。当执行时,指令706还可以使处理器702标识源代码710内的第一虚拟工件716,并基于第一虚拟工件716生成第二字节码718。指令706还可以使处理器702确定第一虚拟工件716具有依赖关系720,并在依赖关系720内标识第二虚拟工件722。可以基于第二虚拟工件718生成第三字节码724,并且第二字节码718和第三字节码724可以被添加到第一字节码714。

本文所述主题的各方面可以单独使用或与本文所述一个或多个方面结合使用。在第一方面中,提供了一种方法,包括接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码,并在该源代码内标识第一虚拟工件。该方法可以进一步包括确定本地存储库没有存储第一虚拟工件,并且从集中式存储库中检索与第一虚拟工件相对应的真实工件。该方法还可以包括,将字节码转换应用于真实工件以生成第二字节码,并将第二字节码添加到第一字节码。

在根据第一方面的第二方面中,该方法进一步包括确定本地存储库存储了第一虚拟工件,并从本地存储库中检索与第一虚拟工件相对应的第三字节码。第三字节码可以被添加到第一字节码。

在根据第一方面至第二方面中的任一方面的第三方面中,该第一虚拟工件代表从本地存储库中检索已转换的字节码的命令。

在根据第三方面的第四方面中,该第一字节码至少部分地基于存储在集中式存储库中的真实工件生成。

在根据第三和第四方面中的任一方面的第五方面中,该第一虚拟工件由接收构建请求的构建环境的分类器标识。

在根据第五方面的第六方面中,该构建环境是集成开发环境的扩展。

在根据第五至第六方面中的任一方面的第七方面中,该构建环境包括网络代理,其从多个计算环境接收构建请求。

在根据第一方面的第八方面中,该方法进一步包括将第二字节码与第一虚拟工件相关联地存储在本地存储库中。

在根据第一至第八方面中的任一方面的第九方面中,执行该方法以将Java企业版库调用转换为Jakarta EE库调用。

在第十方面中,提供了一种系统,其包括处理器和存储器。该存储器可以存储指令,它们在由处理器执行时使处理器接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码并在源代码内标识第一虚拟工件。这些指令可以进一步使处理器确定本地存储库未存储第一虚拟工件,并从集中式存储库中检索与第一虚拟工件相对应的真实工件。这些指令还可以使处理器将字节码转换应用于真实工件,以生成第二字节码并将第二字节码添加到第一字节码。

在根据第十方面的第十一方面中,该存储器存储另外的指令,它们在由处理器执行时使处理器确定本地存储库存储第一虚拟工件,并从本地存储库检索对应于第一虚拟工件的第三字节码。第三字节码可以被添加到第一字节码。

在根据第十和第十一方面中的任一方面的第十二方面中,该第一虚拟工件代表从本地存储库中检索已转换的字节码的命令。

在根据第十二方面的第十三方面中,该第一字节码至少部分地基于存储在集中式存储库中的真实工件而生成。

在根据第十二和第十三方面中的任一方面的第十四方面中,该第一虚拟工件由接收构建请求的构建环境的分类器标识。

在根据第十四方面的第十五方面中,该构建环境是集成开发环境的扩展。

在根据第十四和第十五方面中的任一方面的第十六方面中,该构建环境包括网络代理,其从多个计算环境接收构建请求。

在根据第十至第十六方面中的任一方面的第十七方面中,该存储器存储另外的指令,它们在由处理器执行时使处理器将第二字节码与第一虚拟工件相关联地存储在本地存储库中。

在第十八方面中,提供了一种非暂时性、计算机可读介质,其存储了指令,这些指令在由处理器执行时使处理器接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码并在源代码内标识第一虚拟工件。这些指令还可以使处理器确定本地存储库未存储第一虚拟工件,并从集中式存储库中检索与第一虚拟工件相对应的真实工件。这些指令可以进一步使处理器将字节码转换应用于真实工件,以生成第二字节码并将第二字节码添加到第一字节码。

在第十九方面中,提供了一种系统,包括接收部件,其配置为接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码;以及标识部件,其配置为在源代码内标识第一虚拟工件。该系统可以进一步包括确定部件,其配置为确定本地存储库未存储第一虚拟工件;以及检索部件,其配置为从集中式存储库中检索与第一虚拟工件相对应的真实工件。该系统还可以包括转换部件,其配置为将字节码转换应用于真实工件以生成第二字节码;以及字节码生成部件,其配置为将第二字节码添加至第一字节码。

在第二十方面中,提供了一种方法,包括接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码,并在该源代码内标识第一虚拟工件。该方法可以进一步包括:基于第一虚拟工件生成第二字节码;确定第一虚拟工件具有依赖关系;以及标识该依赖关系内的第二虚拟工件。该方法还可以包括基于第二虚拟工件生成第三字节码,并将第二字节码和第三字节码添加到第一字节码。

在根据第二十方面的第二十一方面中,生成第二字节码包括确定本地存储库未存储第一虚拟工件,从集中式存储库中检索与第一虚拟工件相对应的真实工件,以及将字节码转换应用于真实工件以生成第二字节码。

在根据第二十至第二十一方面中的任一方面的第二十二方面中,生成第二字节码包括确定本地存储库存储了第一虚拟工件,并从本地存储库中检索与第一虚拟工件相对应的第二字节码。

在根据第二十至第二十二方面中的任一方面的第二十三方面中,该第一虚拟工件代表从本地存储库中检索已转换的字节码的命令。

在根据第二十三方面的第二十四方面中,该第一字节码至少部分地基于存储在集中式存储库中的真实工件而生成。

在根据第二十三和第二十四方面中的任一方面的第二十五方面中,该第一虚拟工件由接收构建请求的构建环境的分类器标识。

在根据第二十五方面的第二十六方面中,该构建环境是集成开发环境的扩展。

在根据第二十五和第二十六方面中的任一方面的第二十七方面中,该构建环境包括网络代理,其从多个计算环境接收构建请求。

在根据第二十至第二十七方面中的任一方面的第二十八方面中,该方法进一步包括将第二字节码与第一虚拟工件相关联地存储在本地存储库中。

在根据第二十至第二十八方面中的任一方面的第二十九方面中,执行该方法以将Java企业版库调用转换为Jakarta EE库调用。

在第三十方面中,提供了一种系统,其包括处理器和存储器。该存储器可以存储指令,它们在由处理器执行时使处理器接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码,在源代码内标识第一虚拟工件,并基于第一虚拟工件生成第二字节码。这些指令还可以使处理器确定第一虚拟工件具有依赖关系,并标识该依赖关系内的第二虚拟工件。这些指令可以进一步使处理器基于第二虚拟工件生成第三字节码,并将第二字节码和第三字节码添加到第一字节码。

在根据第三十方面的第三十一方面中,生成第二字节码包括确定本地存储库不存储第一虚拟工件,从集中式存储库检索对应于第一虚拟工件的真实工件,并将字节码转换应用于该真实工件以生成第二字节码。

在根据第三十和三十一方面中的任一方面的第三十二方面中,生成第二字节码包括确定本地存储库存储了第一虚拟工件,并从本地存储库检索与第一虚拟工件相对应的第二字节码。

在根据第三十到三十二方面中的任一方面的第三十三方面中,该第一虚拟工件表示从本地存储库检索已转换的字节码的命令。

在根据第三十三方面的第三十四方面中,至少部分地基于存储在集中式存储库中的真实工件来生成第一字节码。

在根据第三十三和三十四方面中的任一方面的第三十五方面中,该第一虚拟工件由接收构建请求的构建环境的分类器标识。

在根据第三十五方面的第三十六方面中,该构建环境是集成开发环境的扩展。

在根据第三十五和三十六方面中的任一方面的第三十七方面中,该构建环境包括网络代理,其从多个计算环境接收构建请求。

在根据第三十到三十七方面中的任一方面的第三十八方面中,指令进一步使处理器将第二字节码与第一虚拟工件关联地存储在本地存储库中。

在第四十方面中,提供了一种非暂时的、计算机可读的介质,其存储了指令,它们在由处理器执行时,使处理器接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码,并标识源代码内的第一虚拟工件。这些指令可以进一步使处理器基于第一虚拟工件生成第二字节码,确定第一虚拟工件具有依赖关系,并且在依赖关系内标识第二虚拟工件。指令还可以使处理器基于第二虚拟工件生成第三字节码,并将第二字节码和第三字节码添加到第一字节码。

在第四十一方面中,提供了一种系统,包括接收部件,其配置为接收构建请求,以将应用程序的源代码转换为该应用程序的第一字节码;以及标识部件,其配置为在源代码内标识第一虚拟工件。该系统还可以包括配置为确定第一虚拟工件具有依赖关系的确定部件,其中该标识部件进一步配置为在依赖关系内标识第二虚拟工件。该系统可以进一步包括字节码生成部件,其配置为基于第一虚拟工件生成第二字节码,基于第二虚拟工件生成第三字节码,并且将第二字节码和第三字节码添加到第一字节码。

如果这些方面中的任一方面是相互排斥的,应当理解,这种相互排他性不应以任何方式限制这些方面与任何其他方面的结合,无论该方面是否明确叙述。这些方面中的任一方面都可以作为系统、方法、装置、设备、介质等而被要求保护,而不受限制。

可以使用一个或多个计算机程序或组件来实现本发明中描述的所有公开方法和过程。这些组件可以作为一系列计算机指令提供在任何常规计算机可读介质或机器可读介质上,包括易失性和非易失性存储器,诸如RAM、ROM、闪存、磁盘或光盘、光学存储器或其他存储介质。这些指令可以作为软件或固件提供,并且可以在诸如ASIC、FPGA、DSP或任何其他类似设备的硬件组件中全部或部分地实现。这些指令可以配置成由一个或多个处理器执行,它们在执行一系列计算机指令时,执行或促进所公开的方法和过程的全部或部分的执行。

应当理解,对于本领域技术人员而言,对这里描述的示例的各种改变和修改是显而易见的。在不偏离本主题的精神和范围,并且不减损其预期的优点的情况下,可以作出此类改变和修改。因此,意在于所附权利要求中涵盖此类改变和修改。

相关技术
  • 使用虚拟工件的字节码转换
  • 虚拟机字节码文件的保护方法、设备及可读存储介质
技术分类

06120113678791