Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AbstractUIPlugin导致NoClassDefFoundError_Java_Eclipse_Eclipse Plugin_Noclassdeffounderror - Fatal编程技术网

Java AbstractUIPlugin导致NoClassDefFoundError

Java AbstractUIPlugin导致NoClassDefFoundError,java,eclipse,eclipse-plugin,noclassdeffounderror,Java,Eclipse,Eclipse Plugin,Noclassdeffounderror,我正在编写一个Eclipse插件,它支持像JUnit这样的自动化测试。我有一个启动配置委托来启动我的主类,它将在用户提供的类上运行测试 当我使用启动配置委托启动Eclipse插件时,我希望以编程方式显示该插件中的自定义视图。当我尝试启动AbstractUIPlugin类时,我一直收到一个NoClassDefFoundError,尽管我的插件依赖项中同时包含了org.eclipse.ui和org.eclipse.core.runtime 堆栈跟踪 Exception in thread "main

我正在编写一个Eclipse插件,它支持像JUnit这样的自动化测试。我有一个启动配置委托来启动我的主类,它将在用户提供的类上运行测试

当我使用启动配置委托启动Eclipse插件时,我希望以编程方式显示该插件中的自定义视图。当我尝试启动AbstractUIPlugin类时,我一直收到一个NoClassDefFoundError,尽管我的插件依赖项中同时包含了org.eclipse.ui和org.eclipse.core.runtime

堆栈跟踪

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/ui/plugin/AbstractUIPlugin
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at eoo.thefamilycoder.specj.internal.launching.delegate.SpecJMain.main(SpecJMain.java:8)
Caused by: java.lang.ClassNotFoundException: org.eclipse.ui.plugin.AbstractUIPlugin
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 13 more
public class SpecJLaunchConfigurationDelegate extends AbstractJavaLaunchConfigurationDelegate {

    private static final int UNITS_OF_WORK = 4;

    @Override
    public void launch(final ILaunchConfiguration configuration, final String mode, final ILaunch launch,
            final IProgressMonitor monitor) throws CoreException {
        final IProgressMonitor pm = monitor != null ? monitor : new NullProgressMonitor();

        pm.beginTask(configuration.getName(), UNITS_OF_WORK);
        if (pm.isCanceled()) return;

        try {
            preLaunchCheck(configuration, mode, pm);
            if (pm.isCanceled()) return;

            final VMRunnerConfiguration runConfig =
                new VMRunnerConfigurationFactory().create(configuration, monitor, this);
            if (pm.isCanceled()) return;

            getVMRunner(configuration, mode).run(runConfig, launch, pm);
            if (pm.isCanceled()) return;
        } finally {
            pm.done();
        }
    }

    @Override
    public String[] getClasspath(ILaunchConfiguration configuration) throws CoreException {
        final String[] initialClasspath = super.getClasspath(configuration);

        final String pluginClasspath = new SpecJClasspathLocator().getClasspath();
        System.out.println(pluginClasspath);
        if (pluginClasspath == null) return initialClasspath;

        final String[] classpath = new String[initialClasspath.length + 1];
        classpath[0] = pluginClasspath;
        System.arraycopy(initialClasspath, 0, classpath, 1, initialClasspath.length);

        return classpath;
    }

}
MANIFEST.MF

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: SpecJ
Bundle-SymbolicName: eoo.thefamilycoder.specj;singleton:=true
Bundle-Version: 1.0.0.alpha
Bundle-Activator: eoo.thefamilycoder.specj.internal.Activator
Require-Bundle: org.eclipse.ui;bundle-version="3.105.0",
 org.eclipse.core.runtime;bundle-version="3.9.0",
 org.eclipse.jdt.launching;bundle-version="3.7.0",
 org.eclipse.debug.core;bundle-version="3.8.0",
 org.eclipse.jdt.core;bundle-version="3.9.1",
 org.eclipse.debug.ui;bundle-version="3.9.0",
 org.eclipse.jdt.ui;bundle-version="3.9.1",
 org.eclipse.jdt.debug.ui;bundle-version="3.6.200"
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Bundle-ActivationPolicy: lazy
主类

import eoo.thefamilycoder.specj.internal.Activator;

public class SpecJMain {

    public static void main(String[] args) {
        Activator.getDefault().showView();
    }

}
导致错误的原因是什么?我如何修复它? 编辑:添加启动代码

启动配置委托

Exception in thread "main" java.lang.NoClassDefFoundError: org/eclipse/ui/plugin/AbstractUIPlugin
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at eoo.thefamilycoder.specj.internal.launching.delegate.SpecJMain.main(SpecJMain.java:8)
Caused by: java.lang.ClassNotFoundException: org.eclipse.ui.plugin.AbstractUIPlugin
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 13 more
public class SpecJLaunchConfigurationDelegate extends AbstractJavaLaunchConfigurationDelegate {

    private static final int UNITS_OF_WORK = 4;

    @Override
    public void launch(final ILaunchConfiguration configuration, final String mode, final ILaunch launch,
            final IProgressMonitor monitor) throws CoreException {
        final IProgressMonitor pm = monitor != null ? monitor : new NullProgressMonitor();

        pm.beginTask(configuration.getName(), UNITS_OF_WORK);
        if (pm.isCanceled()) return;

        try {
            preLaunchCheck(configuration, mode, pm);
            if (pm.isCanceled()) return;

            final VMRunnerConfiguration runConfig =
                new VMRunnerConfigurationFactory().create(configuration, monitor, this);
            if (pm.isCanceled()) return;

            getVMRunner(configuration, mode).run(runConfig, launch, pm);
            if (pm.isCanceled()) return;
        } finally {
            pm.done();
        }
    }

    @Override
    public String[] getClasspath(ILaunchConfiguration configuration) throws CoreException {
        final String[] initialClasspath = super.getClasspath(configuration);

        final String pluginClasspath = new SpecJClasspathLocator().getClasspath();
        System.out.println(pluginClasspath);
        if (pluginClasspath == null) return initialClasspath;

        final String[] classpath = new String[initialClasspath.length + 1];
        classpath[0] = pluginClasspath;
        System.arraycopy(initialClasspath, 0, classpath, 1, initialClasspath.length);

        return classpath;
    }

}
VMRunnerConfigurationFactory

public class VMRunnerConfigurationFactory {

    public VMRunnerConfiguration create(final ILaunchConfiguration configuration, final IProgressMonitor monitor,
            final AbstractJavaLaunchConfigurationDelegate delegate) throws CoreException {
        final ExecutionArguments execArgs = new ExecutionArguments(delegate.getVMArguments(configuration), "");

            // Activator.MAIN_TYPE_NAME is the main class above
        final VMRunnerConfiguration runConfig = new VMRunnerConfiguration(Activator.MAIN_TYPE_NAME,
            delegate.getClasspath(configuration));
        runConfig.setBootClassPath(delegate.getBootpath(configuration));
        runConfig.setEnvironment(delegate.getEnvironment(configuration));
        runConfig.setProgramArguments(new ProgramArgumentsFactory().create(configuration, monitor));
        runConfig.setVMArguments(execArgs.getVMArgumentsArray());
        runConfig.setVMSpecificAttributesMap(delegate.getVMSpecificAttributesMap(configuration));
        runConfig.setWorkingDirectory(getWorkingDirectoryName(delegate.verifyWorkingDirectory(configuration)));
        return runConfig;
    }

    private String getWorkingDirectoryName(final File workingDir) throws CoreException {
        return workingDir != null ? workingDir.getAbsolutePath() : null;
    }

}

AbstractUIPlugin
位于
org.eclipse.ui.workbench
插件中,因此您需要在依赖项中使用它

编辑

刚刚注意到您使用的是
main
方法-这是一个Eclipse插件,您无法将其作为普通Java程序运行。您必须在现有的EclipseRCP中运行它,或者创建一个RCP

编辑2


您的启动不会正确初始化Eclipse以运行插件。您必须通过
org.Eclipse.equinox.launcher.Main
入口点(通常通过
Eclipse
可执行文件)启动Eclipse应用程序。必须指定要运行的应用程序或产品(如
Eclipse应用程序的
run配置中的

它不起作用。我导入了org.eclipse.ui.plugin.AbstractUIPlugin,它应该包含在org.eclipse.ui依赖项中。org.eclipse.ui.workbench中是否还有另一个我应该导入的?更新时请注意不要使用main。我正在使用自定义启动配置委托来启动主程序。我使用Eclipse应用程序启动插件本身。我们最好向我们展示启动代码,因为我不知道如何正确设置插件,以便在回答中运行更多注释。您实际上在尝试做什么?你是否只想运行一个插件(必须在Eclipse实例中)?@greg-449我已经用插件的摘要编辑了我的问题。