2017-09-28 5 views
-2

내 목표는 Java를 사용하여 VirtualMachine에서 일부 프로세스를 실행하는 것입니다. 우선, 나는 VB에서 코드를 생성하고 연결할 수있는 코드를 가지고 있지만, 21과 89 행에서 예외 (NullPointer는 메인 스레드)가있다. 나는이 문제를 해결하기 위해 몇 가지 대답을 찾고, 오라클 VB가 없으므로 그 문제를 읽는다. 그러나 내 컴퓨터에는 가져온 버전이 있습니다. 이 API를 사용해 본 경험이 있거나 도움을 줄 수있는 경우 어떻게 해결할 수 있는지 자세히 설명해주십시오. 그래서, 내 코드 :
Java API를 사용하여 예외 Oracle VirtualBox

import org.virtualbox_5_1.*; 
import org.virtualbox_5_1.ISession; 
import org.virtualbox_5_1.IProgress; 
import java.util.List; 
import java.util.Arrays; 

public class Events_5_1 { 
    static VirtualBoxManager mgr; 
    static Thread listener; 

    public static void main(String[] args) { 
     String vmName = Long.toString(System.currentTimeMillis()); // Берем рандомное значение имени VirtualMachine 
     System.out.println("Creating VirtualBox instance"); 
     mgr = VirtualBoxManager.createInstance(null); 

     try { 
      listener = new EventWorker(); 
      listener.start(); 
      try { 
       //Создаем пустую машину и сохраняем на диск 
       IMachine vm = mgr.getVBox().createMachine(null, vmName, null, "Other", null);//тестить , разобраться с параметрами 
       vm.saveSettings(); 
       mgr.getVBox().registerMachine(vm); 

       vm = mgr.getVBox().findMachine(vmName); 
       ISession session = mgr.getSessionObject(); 
       IProgress p = vm.launchVMProcess(session, "headless", null); // Вместо headless - ставим процесс ?? 
       p.waitForCompletion(-1); 
       try { 
        if (p.getResultCode() != 0) { 
         throw new RuntimeException(p.getErrorInfo().getText()); 
        } else { 
         p = session.getConsole().powerDown(); 
         p.waitForCompletion(-1); 
         if (p.getResultCode() != 0) { 
          throw new RuntimeException(p.getErrorInfo().getText()); 
         } else { 
         } 

        } 

       } finally { 
        session.unlockMachine(); 
        while (!SessionState.Unlocked.equals(vm.getSessionState())) { 
         try { 
          System.out.println("Waiting for session unlocked"); 
          Thread.sleep(1000L); 

         } catch (InterruptedException e) { 
          System.err.println("Interrupted while vaiting for session unlocked"); 

         } 
        } 
        System.out.println("Deleting machine"); 
        vm.deleteConfig(vm.unregister(CleanupMode.DetachAllReturnHardDisksOnly)); 

       } 
      } finally { 
       listener.interrupt(); 
       try { 
        listener.join(5000); 

       } catch (InterruptedException e) { 
        System.err.println("Inerrupted while vaiting for EventWorker stop"); 

       } 
       if (listener.isAlive()) { 
        System.err.println("Event worked did not stop in a timely fashion"); 
       } else { 
        System.out.println("event worker stoped"); 
       } 
      } 

     } finally { 
      mgr.disconnect(); 
      mgr.cleanup(); 
      System.out.println("Disconecting from VirtualBox"); 
     } 


    } 

    static class EventWorker extends Thread { 
     IEventListener el; 

     @Override 
     public void run() { 
      System.out.println("EventWorker started"); 
      el = mgr.getVBox().getEventSource().createListener(); 

      //TODO: connect gradle, mvnrepository.com idea connect datasource postgre 

      List<VBoxEventType> types = Arrays.asList(VBoxEventType.OnSessionStateChanged, VBoxEventType.OnMachineStateChanged, 
        VBoxEventType.OnMachineRegistered); 
      mgr.getVBox().getEventSource().registerListener(el, types, false); 

      try{ 
       while(!isInterrupted()){ 
        mgr.waitForEvents(0); 
        IEvent rawEvent = mgr.getVBox().getEventSource().getEvent(el , 1000); 
        if(rawEvent==null) continue; 
        try{ 
         System.out.println("Got event type "+rawEvent.getType()); 
         if(VBoxEventType.OnSessionStateChanged.equals(rawEvent.getType())){ 
          ISessionStateChangedEvent event = ISessionStateChangedEvent.queryInterface(rawEvent); 
          System.out.println("Machine "+event.getState()+" for machine "+event.getMachineId()); 
         } 
         if(VBoxEventType.OnMachineRegistered.equals((rawEvent.getType()))){ 
          IMachineRegisteredEvent event = IMachineRegisteredEvent.queryInterface(rawEvent); 
          System.out.println("Machine "+event.getMachineId()+" has been "+(event.getRegistered() ? "registered":"unregistered")); 
         } 
         if(VBoxEventType.OnMachineStateChanged.equals(rawEvent.getType())){ 
          IMachineStateChangedEvent event = IMachineStateChangedEvent.queryInterface(rawEvent); 
          System.out.println("Machine "+event.getMachineId()+" state changed to "+event.getState()); 
         } 
        }finally { 
         mgr.getVBox().getEventSource().eventProcessed(el,rawEvent); 

        } 

       } 
      }catch(Throwable t){ 
       t.printStackTrace(); 
      }finally { 
       mgr.getVBox().getEventSource().unregisterListener(el); 
       System.out.println("EventWorker finished"); 
      } 
     } 
    } 
} 

답변

1

당신이 일반 복사/붙여 넣기 에있는 경우 my code을 적용, 당신은 적어도 코드의 구조와 흐름에 충실해야한다.

몇 가지 이유로 코드를 이동 시켰으며 변수가 적시에 초기화되지 않았으므로 NPE가 필요합니다. 내가 API의 2-3일 (나는 학생입니다)와 함께 작동하기 때문에

Here

+0

덕분에, 난 정말 you'r 코드와 함께 작동 버추얼하여 5.1.x에 대한 작업 버전입니다. 하지만 내 인스턴스가 5.1.26 일 때 버전 4.3. *을 가져올 수는 있지만 시도해 보겠습니다. 나는 내가 수입 한 버전과 오라클 버추얼 박스 버전을 읽고, 내 PC의 인스턴스는 같아야한다. –

+0

VirtualBox 5.1.26을 설치 한 경우 동일한 SDK 버전을 사용해야합니다. Java webservice 바인딩에서 classpath에 추가해야하는 vboxjws.jar을 찾을 수 있습니다.이 코드는 "Here"라는 링크의 코드에서 작동합니다. –