вызов муравья задачи в моем плагине и перенаправить вывод на консоль - PullRequest
3 голосов
/ 29 февраля 2012

В моем плагине eclipse я пытаюсь выполнить задачу Ant и перенаправить вывод на консоль eclipse. Вот мой код:

    AntRunner runner = new AntRunner();
    runner.addBuildLogger("myplugin.AntLogger");        

    String projectPath = getProject().getLocation().toString();
    String buildFileLocation = projectPath + File.separator + "build.xml";
    runner.setBuildFileLocation(buildFileLocation);
    runner.setExecutionTargets(new String[] { "build-for-device" });

Код AntLogger:

public class AntLogger extends org.apache.tools.ant.DefaultLogger {

private IOConsole console = new IOConsole("Ant", null);
private IOConsoleOutputStream outputStream = console.newOutputStream();

public AntLogger() {
    ConsolePlugin.getDefault().getConsoleManager()
            .addConsoles(new IConsole[] { console });
}

@Override
protected void printMessage(String message, PrintStream stream, int priority) {
    super.printMessage(message, stream, priority);
    try {
        outputStream.write(message + "\n");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}

и я добавил файл ant.jar в plugin.xml

<extension
     point="org.eclipse.ant.core.extraClasspathEntries">
  <extraClasspathEntry
        library="ant.jar">
  </extraClasspathEntry>
</extension>

Независимо от того, что я делаю, я получаю исключение: класс не найден:

java.lang.NoClassDefFoundError: org/apache/tools/ant/DefaultLogger
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:188)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClassHoldingLock(ClasspathManager.java:626)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:608)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:562)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:486)
    at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:459)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:216)
    at org.eclipse.osgi.internal.loader.BundleLoader.findLocalClass(BundleLoader.java:400)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:476)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429)
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417)
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.eclipse.osgi.internal.loader.BundleLoader.loadClass(BundleLoader.java:345)
    at org.eclipse.osgi.framework.internal.core.BundleHost.loadClass(BundleHost.java:229)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadClass(AbstractBundle.java:1207)
    at org.eclipse.ant.core.AntCorePreferences$WrappedClassLoader.findClass(AntCorePreferences.java:116)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.eclipse.ant.internal.core.AntClassLoader.loadClassPlugins(AntClassLoader.java:69)
    at org.eclipse.ant.internal.core.AntClassLoader.findClass(AntClassLoader.java:47)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at org.eclipse.ant.internal.core.ant.InternalAntRunner.createLogger(InternalAntRunner.java:747)
    at org.eclipse.ant.internal.core.ant.InternalAntRunner.addBuildListeners(InternalAntRunner.java:202)
    at org.eclipse.ant.internal.core.ant.InternalAntRunner.run(InternalAntRunner.java:572)
    at org.eclipse.ant.internal.core.ant.InternalAntRunner.run(InternalAntRunner.java:498)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.eclipse.ant.core.AntRunner.run(AntRunner.java:378)
    at org.eclipse.ant.core.AntRunner.run(AntRunner.java:475)

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

После этого я наконец нашел решение:

Класс AntLogger не может быть частью проекта плагина. Я переместил AntLogger в другой проект Java с именем EclipseAntLogger, а затем добавил jar проекта в точку расширения плагина следующим образом:

<extension
     point="org.eclipse.ant.core.extraClasspathEntries">
  <extraClasspathEntry
        library="lib/EclipseAntLogger.jar">
  </extraClasspathEntry>
</extension>
0 голосов
/ 06 марта 2012

Помогает ли добавить ant.jar и другие необходимые файлы jar к экземпляру AntRunner?

public void setCustomClasspath(URL[] customClasspath)

# wildstabinthedark

...