Java Glassfish java.lang.IllegalAccessError: tried to access method com.sun.jna.Pointer on glassfish 3.1.2.2

Java Glassfish java.lang.IllegalAccessError: tried to access method com.sun.jna.Pointer on glassfish 3.1.2.2

我遇到了严重的问题,我尝试了所有可能的想法,我也阅读了 Whosebug 上关于类似问题的答案,但对我没有用。

实际发生的是我在 glassfish 3.1.2.2 上部署应用程序。我正在使用 2 个罐子:jna.jarplatform.jar(我尝试了不同的版本,最后我尝试的实际上是:jna-3.3.0.jarjna-3.0.0-platform.jar)我想做的是阅读 Windows 注册表项。我还从 jna.jar 调用其他方法(有趣的是,我不必在我的“.ear”文件内的 lib 目录中包含 jna.jar,这表明 - 它必须已经存在于 glassfish 的某处。当我在 glassfish 目录上搜索它时 - 我找不到它。)。无论如何 - 当我调用 jna.jar 的方法时 - 它工作得很好,当我调用 platform.jar 的方法时,首先我必须在我的 .ear 的 lib 目录中部署那个 platform.jar文件,其次 - 它永远不会工作 - 因为我得到:...

java.lang.IllegalAccessError: 试图从 class com.sun.jna.platform.win32.WinReg$HKEY[ 访问方法 com.sun.jna.Pointer.(J)V =35=]

我已经尝试了我能想到的任何事情:重建我的工作区,重命名 jar,将它们都包含在 .ear 文件的 lib 文件夹中,包括其中一个,根本不包含,包括 glassfish3\glassfish\domains\target\lib\ext,包括 glassfish3\glassfish\domains\target\lib\ext 中的一个或另一个,尝试了这 2 个罐子的不同版本,但没有任何效果。我尝试使用 jni4j.jar 而不是 jna.jar 和 platform.jar,仍然没有帮助。

这是实际代码,使用了jna.jar和platform.jar:

    if (Advapi32Util.registryKeyExists(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\CitySyncSafety")) {
        path = Advapi32Util.registryGetStringValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\CitySyncSafety", "Path") + File.separator + "DetectEngine";
        logger.warning("POJO path is: " + path);
    } else {
        path = "";
        logger.warning("Else POJO path is: " + path);
    }
    String libPath = System.getProperty("java.library.path");
    if (path != null && !path.equalsIgnoreCase("") && !libPath.contains(path)) {
        logger.warning("Library paths are: " + libPath);
        System.setProperty("java.library.path", System.getProperty("java.library.path") + File.pathSeparator + path);
    }
    if (path != null) {
        //System.loadLibrary(path + File.separator + "cutilityProj1.dll");
    }

导致所说的非法访问异常。当我尝试将 jni4j.jar 与以下代码一起使用时,我没有得到任何异常,因为我根本没有得到任何东西:

    try {
        Reg reg = new Reg("HKEY_LOCAL_MACHINE\SOFTWARE");
        Reg.Key cp = reg.get("HKEY_LOCAL_MACHINE\SOFTWARE");
        Reg.Key sound = cp.getChild("CitySyncSafety");
        String p = sound.get("Path");
        path = p  + File.separator + "DetectEngine";;
    } catch (IOException e) {
        if (path == null) {
            path = "";
        }
    }

它只是永远挂在第一行。请注意,我已确保适当的密钥和目录确实存在,因此我们可以排除此问题。我将不胜感激任何帮助,因为我已经在这个问题上花费了 2 天时间。

这是解决方案:)。我不知道是否所有步骤都是必要的(我的意思是,我可以,但我现在不能在工作时被打扰)。所要做的就是将 jna.jar 和 platform.jar 合并到 1 个罐子中,然后将其放入 glassfish3\glassfish\domains\target\lib 和 glassfish3\glassfish\domains\target\lib\ext 中(实际上我敢打赌将其放入 glassfish3\glassfish\domains\target\lib, 不过我没测试).

嗯,至少现在可以了!

如果对您有帮助,请投上一票。