2012-02-29 115 views
3

在我的Eclipse插件,我試圖執行一個Ant任務,並輸出到Eclipse控制檯 這裏重定向是我的代碼:在我的插件調用Ant任務和輸出重定向到控制檯

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) 
+0

你在classpath有ant.jar文件? – oers 2012-03-01 10:47:04

+0

是的,它是在擴展點中添加的,我一遍又一遍地檢查了它。 – Chen 2012-03-01 12:41:23

+0

也許在運行時無法找到它?或者ant.jar不包含那個類? – oers 2012-03-01 14:38:26

回答

3

在這個撞我的頭後,我終於找到了解決辦法:

的AntLogger類不能插件項目的一部分。 我感動AntLogger給它命名爲EclipseAntLogger不同的Java項目,然後我加入這個項目罐子的插件擴展點是這樣的:

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

它是否有助於增加ant.jar和其他必要的罐子到AntRunner實例?

public void setCustomClasspath(URL[] customClasspath) 

#wildstabinthedark

+0

謝謝,但這不起作用。 – Chen 2012-03-06 12:42:44