Java IBMi(AS400)JVM—是否可以定义JVM在何处查找.jar文件?

Java IBMi(AS400)JVM—是否可以定义JVM在何处查找.jar文件?,java,jar,jvm,ibm-midrange,rpg,Java,Jar,Jvm,Ibm Midrange,Rpg,几年前,我们从一家提供商那里购买了一个解决方案,将.jar文件放在了IFS/QIBM/UserData/Java400/ext/中的标准位置,从那以后,我们一直在正确地处理这个问题 然而,几个月前,提供者发布了一个新的.jar,其中包含一些我们想要使用的新函数。然而,他们也改变了我们正在使用的几个类和方法的名称 因此,如果可能的话,我们想做的是定义一条路径,当旧程序需要使用该.jar时,在该路径上查找该.jar。对于我们希望使用新的.jar文件的新程序,我们希望有不同的路径 现在我不知道这是否可

几年前,我们从一家提供商那里购买了一个解决方案,将.jar文件放在了IFS/QIBM/UserData/Java400/ext/中的标准位置,从那以后,我们一直在正确地处理这个问题

然而,几个月前,提供者发布了一个新的.jar,其中包含一些我们想要使用的新函数。然而,他们也改变了我们正在使用的几个类和方法的名称

因此,如果可能的话,我们想做的是定义一条路径,当旧程序需要使用该.jar时,在该路径上查找该.jar。对于我们希望使用新的.jar文件的新程序,我们希望有不同的路径

现在我不知道这是否可行。我一直在到处寻找这个信息,但运气不好。所以,如果有人在这里作为一些线索,这将是美妙的

谢谢你抽出时间

编辑:所以我在阅读你的建议,我有这些结论。 我已经向供应商寻求帮助,但因为这不是为AS400设计的,所以他们不提供支持。 我测试了类路径的可能性。我从/QIBM/UserData/Java400/ext/中删除了这些文件,并将它们放在/QIBM/JARS/old/中,然后我创建了一个CL来执行此操作:

ADDENVVAR ENVVARCLASSPATH值'/QIBM/JARS/old'替换*是

在我第一次执行这个新的CL之后,我尝试了一个程序,该程序将使用我在/QIBM/JARS/old位置中的.jar,我得到了找不到类的错误。所以要么我做错了什么,要么这实际上不是一个解决办法


HotLicks你的意思是不可能让用户A1和B1,A1同时使用/QIBM/JARS/old/A.jar和B1同时使用/QIBM/JARS/new/A.jar吗?

你可以调整。

你可以调整。

你可能想在使用jar的新版本运行时重新定义扩展类路径

创建一个新目录-即/QIBM/UserData/MyJava/ext

将所需的jars文件从/QIBM/UserData/Java400/ext复制到/QIBM/UserData/MyJava/ext

将新jar文件添加到/QIBM/UserData/MyJava/ext

启动Java程序时,使用以下定义设置扩展目录:-Djava.ext.dirs=/QIBM/UserData/MyJava400

注意:您可能需要根据java.ext.dirs的当前设置调整目录。通过从QSHELL运行以下命令,可以找到当前设置


在我的例子中,我将设置-Djava.extdirs=/QOpenSys/QIBM/ProdData/JavaVM/jdk50/32bit/jre/lib/ext:/QIBM/UserData/MyJava/ext

,在运行新版本的jar时,您可能需要重新定义扩展类路径

创建一个新目录-即/QIBM/UserData/MyJava/ext

将所需的jars文件从/QIBM/UserData/Java400/ext复制到/QIBM/UserData/MyJava/ext

将新jar文件添加到/QIBM/UserData/MyJava/ext

启动Java程序时,使用以下定义设置扩展目录:-Djava.ext.dirs=/QIBM/UserData/MyJava400

注意:您可能需要根据java.ext.dirs的当前设置调整目录。通过从QSHELL运行以下命令,可以找到当前设置


就我而言,然后我会设置-Djava.extdirs=/QOpenSys/QIBM/ProdData/JavaVM/jdk50/32bit/jre/lib/ext:/QIBM/UserData/MyJava/ext

这两个应用程序都运行在同一个JVM中吗?为什么不询问您的提供商呢?请注意,您不能同时在一个JVM中加载来自不同类路径的两个不同类,名称相同,包括包名。除非您使用多个类加载器,这是另一层复杂性,但是如果您想在JVM的两个不同实例中使用两个不同的类路径,这非常简单,如下所述。我已经回答了edit中的大多数问题。这两个应用程序是否都在同一个JVM中运行?为什么不询问您的提供商?请注意,您不能同时在一个JVM中加载两个不同的类,它们来自不同的类路径,具有相同的名称(包括包名)。除非您使用多个类加载器,这是另一层复杂性,但是如果您想在JVM的两个不同实例中使用两个不同的类路径,这非常简单,如下所述。我已经回答了EditI中的大多数问题,我尝试了这一点。在编辑中解释。要么是我做错了什么,要么就是这样不行。你可能没有签字,然后又回去了。问题是每个作业只能有一个JVM。一旦启动,它将捕获类路径,并且您不能更改它。你不能为那项工作再找一个JVM。如果工作是互动的,结束它的唯一方法就是签字。我试过这个。在编辑中解释。要么是我做错了什么,要么就是这样不行。你可能没有签字,然后又回去了。问题是每个作业只能有一个 一个JVM。一旦启动,它将捕获类路径,并且您不能更改它。你不能为那项工作再找一个JVM。如果作业是交互式的,那么结束它的唯一方法就是注销。

    echo '!callmethod java.lang.System.getProperty(java.ext.dirs)' |  java -cp /qibm/proddata/http/public/jt400/lib/jt400.jar com.ibm.as400.access.jdbcClient.Main jdbc:db2:localhost

     Call returned /QOpenSys/QIBM/ProdData/JavaVM/jdk50/32bit/jre/lib/ext:/QIBM/UserData/Java400/ext