Я пытаюсь запустить 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();
}
}
Но я не знаю, почему, любые рекомендации будут оценены.
Имейте ту же проблему. Почему вызов vmConfig.setWorkingDirectory (...) решает проблему? Не могли бы вы связаться со мной? leo here mathtech.ru – outmind