有没有办法完全禁用Java安全管理器?
我正在尝试db4o的源代码。它使用反射来持久化对象,并且安全管理器似乎不允许反射读取和写入私有或受保护的字段。
My code:
public static void main(String[] args) throws IOException {
System.out.println("start");
new File( DB_FILE_NAME ).delete();
ObjectContainer container = Db4o.openFile( DB_FILE_NAME );
String ob = new String( "test" );
container.store( ob );
ObjectSet result = container.queryByExample( String.class );
System.out.println( "retrieved (" + result.size() + "):" );
while( result.hasNext() ) {
System.out.println( result.next() );
}
container.close();
System.out.println("finish");
}
Output:
start
[db4o 7.4.68.12069 2009-04-18 00:21:30]
AccessibleObject#setAccessible() is not available. Private fields can not be stored.
retrieved (0):
finish
这个线程 http://developer.db4o.com/forums/permalink/10482/10482/ShowThread.aspx建议修改 java.policy 文件以允许反射,但它似乎对我不起作用。
我正在使用参数启动 JVM
-Djava.security.manager -Djava.security.policy==/home/pablo/.java.policy
因此指定的策略文件将是唯一使用的策略文件
该文件如下所示:
grant {
permission java.security.AllPermission;
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
我在这上面花了最后 3 个小时,但不知道如何让它发挥作用。
任何帮助表示赞赏。
您可以尝试将其添加到程序的 main() 中:
System.setSecurityManager(null);
当我遇到安全管理器问题时,为我工作了一个“受信任的”WebStart 应用程序。不确定它是否适用于您的 db4o 案例,但可能值得一试。
编辑:我并不是说这是安全管理器问题的通用解决方案。我只是建议将其作为帮助调试原始海报问题的一种方法。显然,如果您想从安全管理器中受益,那么您不应该禁用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)