gpt4 book ai didi

java - 如何使用 informix.jvp.dbapplet.impl.JVPClassLoader 从类路径加载资源?

转载 作者:太空宇宙 更新时间:2023-11-04 13:15:54 26 4
gpt4 key购买 nike

我想解决在用 Java 编写的 Informix 存储过程中加载资源的非常具体的问题。我有 IFX v12 和 IBM Java 1.7,当我想从类路径(即某些属性文件)加载任何资源时,我收到 IOException 并显示消息“找不到资源”。

起初我以为这会是 Java 策略的问题,但是当我允许所有权限时,没有任何改变。

接下来,当我能够远程调试存储过程时,我发现该存储过程使用 informix 特定的类加载器 informix.jvp.dbapplet.impl.JVPClassLoader。在调试中我发现,这个类加载器没有在其类路径上的数据库中加载 JAR,因此该 JAR 中的资源不可用。我无法很好地调试它,因为我没有这个类加载器的可用源代码。

我有两个解决方案,但都很丑陋。我可以将 JAR 放入 Informix 启动的 Java 进程的类路径中,但每次我想在 JAR 中进行任何更改时,我都必须重新启动此进程。第二种解决方案是从文件系统加载此资源,但这使部署过程变得复杂并且使其无法抵抗故障(当然还取决于环境)。

感谢您提供有关如何使我的 JAR 资源在类路径上可用的建议!

最佳答案

好的,我们终于找到了从 Informix 数据库中加载的 JAR 中读取属性文件的解决方案。无法通过 JVPClassLoader 访问 JAR 中的属性文件(并且使用系统类加载器不够灵活,请参阅上面帖子中的解决方法)。唯一的方法是从Informix系统表retained_jars中读取JAR文件,并直接从JAR文件中读取属性文件。我们看一下这段Java代码:

public Properties loadPropertiesFromInformixRetainedJarsTable(final String propertyFileName) {
final Connection conn = ...;
final Statement stmt = conn.createStatement();
final ResultSet rs = stmt.executeQuery("SELECT jarname, jardata FROM retained_jars");

if (rs.next()) {
final JarInputStream jar = new JarInputStream(rs.getBinaryStream("jardata"));

JarEntry jarEntry;
while ((jarEntry = jar.getNextJarEntry()) != null) {
if (jarEntry.getName().equals(propertyFileName)) {
// read JAR entry content
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final byte[] buf = new byte[2048];
int readCnt;

// reading from JarInputStream reads from current JarEntry
while ((readCnt = jar.read(buf, 0, 2048)) != -1) {
baos.write(buf, 0, readCnt);
}

final Properties properties = new Properties();
// load properties from byte array through StringReader
properties.load(new StringReader(new String(baos.toByteArray())));

return properties;
}
}
}

// here should be of course some usual cleaning of resources (like connection, input stream ...)

}

希望这对其他人有帮助!

关于java - 如何使用 informix.jvp.dbapplet.impl.JVPClassLoader 从类路径加载资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33522385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com