to understand the present invention , it helps to have an understanding of the java naming and directory interface ( jndi ); jndi is a naming service that allows a program or container to register a name for an object ( service ). this name is commonly referred to as the jndi name . the jndi naming service provides a list of services identified by jndi names , organized in a “ tree ” structure , that are hosted on an j2ee application server . clients then obtain a service by connecting to the application server and looking up the bound jndi name of the service . the jndi names are alias names in the context of the present invention . fig1 is a block diagram illustrating the architecture and operation of a typical jndi naming service being used to provide access to , in this example , enterprise java beans ( ejbs ). referring to fig1 , a first client 110 ( client x ) and a second client 120 ( client y ) access an application server 130 . an ejb 134 is shown . this ejb has a jndi ( alias ) name of “ service a ”. since there is only a single application with a single name , client 110 and client 120 each can request service a using the same service name , e . g ., a service name such as “ lotus notes ” or a service name that is the same as the alias name used by the application server , that is , service a . since both clients 110 and 120 are accessing the same program , there is no concern about which application will be served to the clients ; there is only one choice . referring now to fig2 , a situation is illustrated where there are two available versions of service a , a first version called service a , version 1 and a second version called service a , version 2 . since both clients 110 and 120 are accessing the program using a single service name ( e . g ., lotus notes or service a ), both clients must access the same version , since prior art systems have no way of binding the same service name to different alias names . thus , if ejb 134 , which corresponds to version 1 of service a , is identified by the service name “ lotus notes ”, then when each client requests access to the service name lotus notes , they will be directed to ejb 134 . if one of the clients , for example client 110 , decides to switch to use the service a , version 2 , designated by ejb 244 , then either both clients will have to access the same version ( since ejb 244 will now have a pointer associated with the service name lotus notes so that anyone requesting lotus notes is directed to ejb 244 ), or clients 110 and 120 will have to be “ version aware ”, meaning that distinct service names will have to be designated for each of ejb 134 and ejb 234 ( e . g ., lotus notes v . 1 and lotus notes v . 2 ) and then each client will have to be configured so that they access the different versions ( client 110 will access lotus notes v . 2 while client 120 will access lotus notes v . 1 ). this alternate path is illustrated by the dotted line extending from client 110 to ejb 244 . as noted above , it is undesirable to require the clients to be version aware or to require that they all use the same version of a particular program or service . fig3 illustrates a first embodiment of the present invention . referring to fig3 , jndi proxy servers 350 and 352 are interposed between each client and the application server 130 . in the case where only a single application version is available on the application server ( e . g ., if , in fig3 , there was only a single version of service a , identified as ejb 134 , more specifically service a , version 1 ), then jndi proxy 350 would bind the service name ( a public name ) used by client 110 to ejb 134 , and jndi proxy 352 would bind the service name used by client 120 to the same ejb 134 . presumably , the service name for each would be identical ; however , with the binding process performed by the proxies , it is not necessary that they be the same . in the case where there are multiple versions as shown in fig3 , if , for example , client 110 wishes to utilize the second version , service a , version 2 illustrated by ejb 244 , then proxy server 350 will bind the service name used by client 110 ( which can be the same service name used by client 120 to access version 1 ) to ejb 244 instead of to ejb 134 . in this manner , while on the surface each client may be “ asking ” for the same application / service ( since they are using , for example , the same service name to make the request ) the proxy servers will correctly serve the appropriate version to each client . the application server “ knows ” which version each client wishes to access because this information is obtained from the client when the client makes a request for a service from the application server . on the client &# 39 ; s end , there is a set up process that identifies the version of the software / program / service that the client will be accessing . in the client &# 39 ; s set up process , each client has a configuration file that identifies which version of a particular application the client intends to use , and if this changes , the information is revised during a subsequent set up process using well - known techniques , for example , as part of the installation process for the new version . this information is stored in a configuration file for each client on the client &# 39 ; s end . at start up , each proxy ( located on the client &# 39 ; s machine ) reads the configuration file to determine which version the client intends to use , and when the client requests a service from the application server , binds the alias name of that version to the service name used by the client to access that program . whenever the client changes the version it wishes to use , the proxy server associated with that client binds the newly desired version with the service name , so that the client will always get the right version , while other clients can access different versions using the same service name . in addition to remote clients , the jndi proxy can also be used by internal application components to perform look up of other j2ee objects , e . g ., to handle a delegation - of - services operation . for example , referring to fig4 , assume that ejb 134 specializes in handling requests such as data validation while ejb 446 specializes in information retrieval . an internal jndi proxy 454 is situated between ejb 134 and ejb 446 such that ejb 446 is invoked upon request from ejb 134 . this is an example of a delegation - of - services operation . thus , if ejb 134 determines that a request does not possess all of the required validation information required to access ujb 446 ( e . g ., a required social security number has not been provided ), then ejb 134 will not call the next service , the data retrieval service performed by ejb 446 . likewise , a second ejb 446 can be delegated by ejb 244 via proxy 456 in the same manner . fig5 illustrates the flexibility available using the system of the present invention . in this example , a second level of delegation is illustrated , whereby client 120 invokes service a , version 1 represented by ejb 134 and ejb 134 in turn invokes service b , version 1 represented by ejb 436 . ejb 436 in turn can invoke service c , version 1 , represented by ejb 560 ( this invocation is illustrated by the dotted line connection ejb 436 to ejb 560 ). however , fig5 also illustrates that it is not necessary that the same version be maintained across all service invocations . as shown by the solid arrow from ejb 436 to ejb 562 , service b , version 1 ( ejb 436 ) can be configured to invoke service c , version 2 ( ejb 562 ) instead of service c , version 1 ( ejb 560 ). this illustrates the flexibility of the jndi proxy to be configured to direct services across different versions as desired . although described above with respect to providing version management for services provided through ejb resources , there are additional j2ee resources that can be affected by application versioning . for example , the jndi proxy can be used for application versioning management of jms resources . jms resources include queues , queue connection factories , topics , and topic connection factories . like other j2ee resources , each jms resource can be bound by a name in the jndi name service in the application server . these jms resources can then be acquired and used by external clients or by internal ejbs . thus , for example , as shown in fig6 , ejb 632 and ejb 642 are each separately connected , via jndi proxies 664 and 666 , respectively , to jms queues 668 and 670 , respectively . each queue can be associated with the service name used by a particular client so that regardless of the service name used by the client , the information destined for or coming from the queue will always be linked to the correct client . fig7 is a flowchart illustrating an example of the basic steps performed in order to utilize the jndi proxy server to enable multiple versioning in accordance with the present invention . referring to fig7 , at step 702 the process begins , and at step 704 , the client identifies the program / service to be accessed from the application server . typically this would be performed during the installation of a particular software program on the client , for example , installation of software that will access the application server and retrieve a particular service or software solution from the server . at step 706 , as part of this process , the service provider ( the owner of the services provided on the application server ) creates a configuration file identifying the program / service and version used by the particular client . at step 708 , the client requests the application using its service name . as discussed above , the service name can be the same for all clients accessing the application server , regardless of which version each client is using . at step 710 , the proxy receives the request from the client , and at step 712 , the proxy determines the version used by the client . the proxy does this by reading the configuration file . the proxy then directs the server to serve the correct version , using the appropriate alias name associated with the service name provided by the client . at step 714 , the server serves the appropriate version of the application to the client , and the process ends at step 716 . as is clear , the use of the jndi proxies enables a great deal of flexibility in delivering and / or routing of programs , services , data , etc . between clients and their ultimate connection points . this invention can find application in application server architecture , email routing , bank transaction management , and any other environment where it is desired to have a client be free from the necessity of being version aware . as described above , using the present invention , control of which version and / or release to deliver to a client from an application server is controlled by the proxy based on configuration information submitted by a particular client . thus , the service name used to access the application / service does not need to be changed , but merely the binding of that name for a particular client to the particular version / release desired . this simplifies use of the client for the user , who typically does not care to have to specify between various versions , releases , etc . ; they simply want to type in a familiar name and receive the application or service requested . this simplifies use of the system by the user , and also simplifies administration of releases and versions by system administrators . fig8 and 9 illustrate the use of the present invention in connection with a jdbc datasource . a first example of such a datasource is illustrated in fig8 . in fig8 , a client 802 is coupled via a jndi proxy 804 to ejbs 806 and 808 ( each of which , in this example , illustrate delegation - of - services operations described above ). each of ejbs 806 and 808 are connected to jdbc datasources ; in this example ejb 806 is connected to jdbc datasource 810 , and ejb 808 is connected to jdbc datasource 812 . each of the jdbc datasources is in turn coupled to a database 814 . the jdbc datasource is a named group containing ready - to - use jdbc connections . it establishes database connections when the connection pool starts up , and eliminates the overhead of establishing database connections on demand at run time . a datasource object enables jdbc clients to obtain a database connection . each datasource object has a unique jndi name and points to a jdbc connection pool . a client , which can be , for example , a java application , an ejb , or an mdb , performs a jndi look up for the datasource to get a database connection . to support datasources for multiple application versions , different datasource versions can be configured for different application versions . with this option , datasources will be created for each application version . each datasource will have a unique jndi name , different from its peer in another application version . application code that obtains database connections from datasources such as a java client , an ejb , or an mdb , will use the similar approach of going through the jndi proxy to perform a transparent jndi name translation to access the appropriate datasource intended for that version . for example , in the illustration of fig8 , database 814 can represent a bank , and datasource 810 can represent a checking account with the bank , while datasource 812 can represent a savings account with the bank . this allows client 802 to direct checking deposits through datasource 810 and savings deposits through datasource 812 , both of which will end up eventually at the bank 814 . fig9 illustrates essentially the same architecture , but in this case , datasource 810 , pertaining to the checking account , has been eliminated , and all data ( e . g ., electronic deposits ) are directed through datasource 812 , pertaining to the savings account . this would allow , for example , a user to decide to direct all deposits , etc . through the savings account if the bank decides to begin charging for use of the checking account . from the client perspective , the user will still designate deposits to go to checking and / or savings , but no apparent changes are made at the client end ; all of the redirections are performed via the jndi proxies as shown and described herein . the above - described steps can be implemented using standard well - known programming techniques . the novelty of the above - described embodiment lies not in the specific programming techniques but in the use of the steps described to achieve the described results . software programming code which embodies the present invention is typically stored in permanent storage of some type , such as permanent storage associated with the client and / or application server . the software programming code may be embodied on any of a variety of known media for use with a data processing system , such as a diskette , or hard drive , or cd - rom . the code may be distributed on such media , or may be distributed to users from the memory or storage of one computer system over a network of some type to other computer systems for use by users of such other systems . the techniques and methods for embodying software program code on physical media and / or distributing software code via networks are well known and will not be further discussed herein . it will be understood that each element of the illustrations , and combinations of elements in the illustrations , can be implemented by general and / or special purpose hardware - based systems that perform the specified functions or steps , or by combinations of general and / or special - purpose hardware and computer instructions . these program instructions may be provided to a processor to produce a machine , such that the instructions that execute on the processor create means for implementing the functions specified in the illustrations . the computer program instructions may be executed by a processor to cause a series of operational steps to be performed by the processor to produce a computer - implemented process such that the instructions that execute on the processor provide steps for implementing the functions specified in the illustrations . accordingly , the figures support combinations of means for performing the specified functions , combinations of steps for performing the specified functions , and program instruction means for performing the specified functions . while there has been described herein the principles of the invention , it is to be understood by those skilled in the art that this description is made only by way of example and not as a limitation to the scope of the invention . accordingly , it is intended by the appended claims , to cover all modifications of the invention which fall within the true spirit and scope of the invention .