0

请注意,这已发布在 Oracle Java 论坛上, 网址为https://forums.oracle.com/thread/2577877

我有一个显示图表的简单小程序;此小程序有两个 jar 文件,主 jar 文件由受信任的 CA 签名,另一个 jar 文件未签名

在已签名 jar 文件的清单中,我添加了

Trusted-Library value="true" 

当小程序从 java 控制台启动时,它试图从未签名的 jar 文件中调用类上的创建对象,我从未签名的 jar 中获取java.lang.ClassNotFoundException给定的类。

我已经在基于各种 Java 7 版本(Internet Explorer 上的 40、21 和 Chrome 上的版本 6)的 Windows 7 Chrome 和 Internet Explorer 上尝试过这个

这没用。

如果我签署了第二个 jar 文件,它工作正常。

请注意,我不想绕过 java 配置中的混合代码检查。

任何想法或提示将不胜感激。

4

1 回答 1

0

帖子https://forums.oracle.com/thread/2280127证实了这一点

并由 Oracle http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/mixed_code.html#trusted_library确认

“如果要使用受信任库清单属性标记的 jar 文件中的代码使用依赖于类加载器的调用,则可能需要稍微修改 [...] 受信任库中的代码可以查找正常的加载器通过调用 Thread.currentThread().getContextClassLoader().[...] 通常,必须注意确保受信任库中的代码以谨慎和安全的方式编写,并且与在单独的来自任何剩余 jar 的类加载器实例,这些 jar 是应用程序的一部分,由普通加载器加载。”

“Thread.currentThread().getContextClassLoader().[...]”

我只是做了一个简单的测试,将一个受信任的 jar 中的方法调用到沙盒 jar 中,我使用反射来做到这一点并且它有效。

似乎每次使用受信任的 jar 文件中的任何沙箱 jar 文件类,我们都必须使用反射(加载类,调用所需的方法)。这是前进的方向吗。有人可以证实这一点。

私人无效使用反射(){尝试{

       // using normal class loader 
     Class<?> clazz = Class.forName("com.abc.bla.bla.SandBox", true, Thread.currentThread().getContextClassLoader());
     Constructor<?> constructor = clazz.getConstructor();
     Object obj = constructor.newInstance(new Object[] {});

     Method method = clazz.getMethod("sayHello", new Class[] {});
     method.invoke(obj, new Object[] {});
  }
  catch (Exception ex)
  {
     ex.printStackTrace();
  }

}

总之,似乎我们必须使用反射来加载沙箱 jar 文件(不受信任)以允许使用普通类加载器并避免默认的通过 import 语句,这是为签名(受信任)jar 设计的特殊语句根据清单附加属性处于混合模式的文件。

于 2013-09-11T16:48:38.260 回答