2015-10-09 16 views
0

在調用java.awt.image.RenderedImage的getWidth()方法時獲取java.security.AccessControlException類。在調用java.awt.image.RenderedImage的getWidth()方法時獲取java.security.AccessControlException類

代碼這是造成問題

new Dimension(this.image.getWidth(), this.image.getHeight()) 

在上面的代碼this.image是類型java.awt.image.RenderedImage類

完整棧跟蹤

 
java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.com.sun.media.jai.util") 
    at java.security.AccessControlContext.checkPermission(Unknown Source) 
    at java.security.AccessController.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPermission(Unknown Source) 
    at java.lang.SecurityManager.checkPackageAccess(Unknown Source) 
    at sun.plugin2.applet.SecurityManagerHelper.checkPackageAccessHelper(Unknown Source) 
    at sun.plugin2.applet.AWTAppletSecurityManager.checkPackageAccess(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass0(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
    at sun.plugin2.applet.Plugin2ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at javax.media.jai.ScaleOpImage.layoutHelper(ScaleOpImage.java:228) 
    at javax.media.jai.ScaleOpImage.(ScaleOpImage.java:437) 
    at com.sun.media.jai.opimage.ScaleNearestBinaryOpImage.(ScaleNearestBinaryOpImage.java:77) 
    at com.sun.media.jai.opimage.ScaleCRIF.create(ScaleCRIF.java:123) 
    ... 33 more 

注:

我已添加foll欠我的線到我的java.policy文件

permission java.lang.RuntimePermission "accessClassInPackage.*"; 
permission java.lang.RuntimePermission "accessClassInPackage.com.sun.media.jai.opimage"; 

仍然沒有工作。有沒有人遇到過這個問題?我在JRE版本上運行的小程序1.8.0_45

UPDATE:

相同的代碼會如果再加上以下條目java.policy文件

permission java.util.PropertyPermission com.sun.media.imageio.disableCodecLib", "read"; 
+1

*「我已經添加以下行到我的java.policy文件」 *政策文件是無用的,當談到部署,現在每個小應用程序都需要進行數字簽名,以便有機會在瀏覽器中啓動。因此,我建議將功能添加到構建中,以便對其進行簽名,然後從那裏開始(忽略策略文件)。 –

+0

@Andrew Thompson非常感謝您的回覆。我正在使用的Applet版本是僅簽名的。 –

+1

*「我正在使用的Applet版本是僅有簽名的。」*確保它在清單中聲明瞭「all-permissions」,然後策略文件是不相關的。 –

回答

0

得到它的工作很好地工作的Java 7 。以下是我已完成的修復的詳細信息

1]將permission:all-permissions添加到MANIFEST.MF:實際上,我的小應用程序jar已在其清單中包含此條目。但我的jar依賴於jai-core,jai-imageio和jai-codec jars,它們沒有這個入口。所以我使用maven遮罩插件生成了一個超級jar,這樣我的applet jar和它的所有依賴將被打包在一個jar中,並引用它的清單,它將在其清單中有條目permission:all-permissions

2]在完成步驟1之後,漸漸java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "accessClassInPackage.com.sun.media.jai.util")

此異常可以通過2種

解決的]通過,因爲它需要添加條目permission java.lang.RuntimePermission "accessClassInPackage.com.sun.media.jai.util";到java.policy文件可在位置C:\Program Files\Java\jre1.8.0_45\lib\security

這種做法是不是很爽找到modifi每個客戶端系統中的java.policy文件。所以我使用了替代方法來實現PrivilegedAction,如方法b

b]通過實現PrivilegedAction,您必須實現它的run()方法。 run()方法內的所有代碼將在啓用特權的情況下執行,以便您不會得到任何AccessControlException。您可以識別拋出AccessControlException的代碼,並將該代碼放入重寫的run()方法中,以便代碼具有必要的特權。

對於我來說,下面的代碼的exaple被扔的AccessControlException

graphics2d.drawRenderedImage(image, new AffineTransform()); 

要解決它,我已經在我的課創建一個私有類和實施的PrivilegedAction像下面

private final class DrawRenderedImage implements PrivilegedAction 
{ 
    private Graphics2D graphics2D = null; 

    public DrawRenderedImage(Graphics2D graphics) 
    { 
     graphics2D = graphics; 
     // TODO Auto-generated constructor stub 
    } 

    public Object run() 
    { 

      graphics2D.drawRenderedImage(image, new AffineTransform()); 


     return new Boolean(true); 
    } 
} 

正如你可以看到我把運行方法裏面引起問題的代碼放進去了。現在運行方法可以調用如下:

AccessController.doPrivileged(new DrawRenderedImage(graphics2d)); 

這裏AccessController類會調用PrivilegedAction實例的run方法。

這樣做,你不必把在java.policy文件的權限,在方法上提到

相關問題