2010-09-16 4 views
1

Я пытаюсь запустить java-программу в плагине eclipse, но не удалось.Ошибка запуска программы java в плагине eclipse

Что я пытаюсь сделать, это привести пример из «Вклад в затмение» для работы.
В этом примере плагин предоставляет элемент меню для затмения,
, когда вы выбираете тестовый класс, вы можете использовать это меню для запуска тестовых примеров в классе.

Для запуска тестового чехла есть два класса TestRunner и SocketTestRunner.
TestRunner Запустите SocketTestRunner как отдельную программу java и сообщите
через разъем.

Кодекс TestRunner, связанные с запуском программы Java:

final String MAIN_CLASS = "org.eclipse.contribution.junit.SocketTestRunner"; 
public TestRunner() { 
} 

public void run(IType type) throws CoreException { 
    project = type.getJavaProject(); 
    run(new IType[] { type }); 
} 

public void run(IType[] classes) throws CoreException { 
    IVMInstall vmInstall = JavaRuntime.getVMInstall(project); 
    if (vmInstall == null) 
     vmInstall = JavaRuntime.getDefaultVMInstall(); 
    if (vmInstall == null) 
     return; 

    IVMRunner vmRunner = vmInstall.getVMRunner(ILaunchManager.RUN_MODE); 
    if (vmRunner == null) 
     return; 

    String[] classPath = computeClasspath(); 

    // prepare arguments: 
    // Argument[0] = port 
    // Argument[1-n] = types 
    port = SocketUtil.findFreePort(); 
    String[] args = new String[classes.length + 1]; 
    args[0] = Integer.toString(port); 
    for (int i = 0; i < classes.length; i++) { 
     args[1 + i] = classes[i].getFullyQualifiedName(); 
    } 
    VMRunnerConfiguration vmConfig = new VMRunnerConfiguration(MAIN_CLASS, 
      classPath); 
    vmConfig.setProgramArguments(args);  

    ILaunch launch = new Launch(null, ILaunchManager.RUN_MODE, null); 
    vmRunner.run(vmConfig, launch, null); 

    connect(); 
} 

SocketTestRunner Кодекс:

public static void main(String[] args) { 
    try { 
     logger = new PrintWriter(new FileWriter("log.txt"), true); 

     logger.println("main"); 
     for (int i = 0; i < args.length; i++) { 
      logger.println(args[i]); 
     } 

     new SocketTestRunner().runTests(args);   
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (logger != null) { 
      logger.close(); 
     } 
    } 
} 

private void runTests(String[] args) {  
    port = Integer.parseInt(args[0]); 
    logger.println("port: " + port); 
    openClientSocket(); 
    try { 
     logger.println("Befor new TestSuite"); 
     TestSuite suite = new TestSuite(); 
     for (int i = 1; i < args.length; i++) { 
      logger.println("add TestSuite"); 
      suite.addTestSuite(Class.forName(args[i]).asSubclass(TestCase.class)); 
     } 

     logger.println("starting tests " + suite.countTestCases());   
     //writer.println("starting tests " + suite.countTestCases()); 

     logger.println("Before TestResult"); 
     TestResult result = new TestResult(); 
     logger.println("After TestResult"); 
     result.addListener(this); 
     suite.run(result); 
     //writer.println("ending tests "); 
     logger.println("ending tests "); 
    } catch (Exception e) { 
     logger.println("exception: " + e.getMessage()); 
     logger.println(e.toString()); 
     e.printStackTrace(logger); 
     e.printStackTrace(); 
    } finally { 
     closeClientSocket(); 
    } 
} 

private void closeClientSocket() { 
    logger.println("closeClientSocket"); 
    if (writer != null) { 
     writer.close(); 
    } 

    try { 
     socket.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private void openClientSocket() { 
    logger.println("openClientSocket"); 
    try { 
     socket = new Socket("localhost", port); 
     writer = new PrintWriter(socket.getOutputStream(), true); 
     return; 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Когда я проверяю в затмении (3.6.0 HELIOS), я создаю простой тест JUnit случай в runtime eclipse,
выберите тестовый класс и щелкните пункт меню в контекстном меню,
, тогда затмение во время выполнения не будет реагировать на дальнейшее взаимодействие,
пусть ServerSocket все еще продолжает слушать, и тестовый журнал, который я добавляю для отладки.

И я могу получить командную строку, которая затмение используется для запуска SocketTestRunner:

"C:\Program Files\Java\jre6\bin\javaw.exe" -classpath C:\Users\User\workspace\org.eclipse.contribution.junit\bin;C:\Users\User\workspace\org.eclipse.contribution.junit\plugins\org.eclipse.contribution.junit_1.0.0.201009102354.jar;C:\Users\User\runtime-EclipseApplication\Hello\bin;C:\Users\User\workspace\org.junit\junit.jar;"C:\Program Files\eclipse\plugins\org.hamcrest.core_1.1.0.v20090501071000.jar" org.eclipse.contribution.junit.SocketTestRunner 41872 org.eclipse.contribution.hello.HelloTest 

Когда я использую эту команду вручную, я могу запустить тестовый пример успеха (после комментариев сокета связанных writer), а Я могу получить тестовый журнал.

main 
41872 
org.eclipse.contribution.hello.HelloTest 
port: 41872 
openClientSocket 
Befor new TestSuite 
add TestSuite 
starting tests 1 
Before TestResult 
After TestResult 
starting test testSayHi(org.eclipse.contribution.hello.HelloTest) 
failing test testSayHi(org.eclipse.contribution.hello.HelloTest) 
END TRACE 
ending tests 
closeClientSocket 

Любой совет будет оценен, спасибо.

Наконец-то я запускаю этот плагин.
Вы должны установить рабочий каталог.

vmConfig.setWorkingDirectory("C:\\Users\\User"); 

Когда я пытаюсь получить рабочий каталог, я получаю null.

Вы не можете установить точку останова в строке, вызывающей функцию connect().

private void connect() { 
    try { 
     ServerSocket server = new ServerSocket(port); 
     try { 
      Socket socket = server.accept(); 
      try { 
       readMessage(socket); 
      } finally { 
       socket.close(); 
      } 
     } finally { 
      server.close(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Но я не знаю, почему, любые рекомендации будут оценены.

+0

Имейте ту же проблему. Почему вызов vmConfig.setWorkingDirectory (...) решает проблему? Не могли бы вы связаться со мной? leo here mathtech.ru – outmind

ответ

0

Вы можете, но проблема возникает непосредственно перед вызовом метода connect. Таким образом, подключаемые плагины перед подключением вызваны в ожидании запуска SocketTestRunner.

+0

В моем случае это также было связано с отсутствием 'junit.jar' в classpath для SocketTestRunner. Добавили classPath [2] = ... "junit.jar" в метод 'computeClasspath'. – outmind