2013-08-26 166 views
0

任何有經驗的人使用Java-Sandbox,我已經實現了文檔中找到的基本示例之一,但我無法得到它的工作。java-sandbox示例拋出java.lang.NoClassDefFoundError

代碼: SandPlayground.java

import java.util.concurrent.TimeUnit; 
import net.datenwerke.sandbox.*; 
import net.datenwerke.sandbox.SandboxContext.AccessType; 
import net.datenwerke.sandbox.SandboxContext.RuntimeMode; 
import net.datenwerke.sandbox.SandboxedEnvironment; 


public class SandPlayground { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     System.out.println("Running..."); 


     SandboxService sandboxService = SandboxServiceImpl.initLocalSandboxService(); 

     // configure context 
     SandboxContext context = new SandboxContext(); 
     //context.setRunRemote(true); 
     context.setRunInThread(true); 
     context.setMaximumRunTime(2, TimeUnit.SECONDS, RuntimeMode.ABSOLUTE_TIME); 
     context.addClassPermission(AccessType.PERMIT, "java.lang.System"); 
     context.addClassPermission(AccessType.PERMIT, "java.io.PrintStream"); 

     //run code in sandbox 
     SandboxedCallResult<String> result = sandboxService.runSandboxed(MyEnvironment.class, context, "This is some value"); 

     // output result 
     System.out.println(result.get()); 

    } 

} 

MyEnvironment.java

import net.datenwerke.sandbox.SandboxedEnvironment; 
public class MyEnvironment implements SandboxedEnvironment<String> { 

    private final String myValue; 

    public MyEnvironment(String myValue){ 
     this.myValue = myValue; 
    } 

    @Override 
    public String execute() throws Exception { 
     /* run untrusted code */ 
     System.out.println(myValue); 


     /* return some value */ 
     return "This is a different value"; 
    } 
} 

而我得到的錯誤:

編輯:我已經包括了依賴,但我仍然收到一些錯誤:

通過上面我的代碼得到:

Exception in thread "main" net.datenwerke.sandbox.exception.SandboxedTaskKilledException: killed task as maxmimum runtime was exceeded 
    at net.datenwerke.sandbox.SandboxMonitorDaemon.testRuntime(SandboxMonitorDaemon.java:82) 
    at net.datenwerke.sandbox.SandboxMonitorDaemon.run(SandboxMonitorDaemon.java:57) 
    at java.lang.Thread.run(Thread.java:724) 

,當我刪除context.setMaximumRunTime()調用,我得到:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/collections/map/IdentityMap ... 

任何幫助深表感謝。

回答

1

很可能您錯過了javassist庫(請參閱沙箱的依存關係文檔:http://blog.datenwerke.net/p/the-java-sandbox.html)。您可以在sourceforge上找到javassist庫:https://sourceforge.net/projects/jboss/files/Javassist/

javaassist庫用於刪除加載的代碼中的終結器。這可以關閉在沙箱上下文中:

contex.setRemoveFinalizers(false) 

希望這會有所幫助。

+0

我完全錯過了依賴關係,但現在我包括他們即時獲取新錯誤(我編輯了這個問題),commons集合是如此是一個特定的版本,即時通訊使用4.4.0? –

+0

哦,我應該提到「這是一些價值」正在返回,所以我認爲它與result.get() –

+0

有關。4.0是一個alpha版本,我不知道它是否意味着兼容。轉到版本3.2.1 –

相關問題