Java 找不到符号RunAction2

Java 找不到符号RunAction2,java,maven,jenkins,plugins,Java,Maven,Jenkins,Plugins,现在我正在努力为詹金斯学习插件编程。我从Hello World教程开始,可以找到 基本的Hello World插件对我来说很好,但在最后添加一个侧面板时,只要我尝试mvn验证,就会出现以下错误: [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 17.570 s [INFO] Finished at: 201

现在我正在努力为詹金斯学习插件编程。我从Hello World教程开始,可以找到

基本的Hello World插件对我来说很好,但在最后添加一个侧面板时,只要我尝试
mvn验证
,就会出现以下错误:

[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 17.570 s
[INFO] Finished at: 2018-02-06T08:34:41+01:00
[INFO] Final Memory: 48M/892M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.
6.1:compile (default-compile) on project demo: Compilation failure: Compilation
failure:
[ERROR] /C:/Users/jschoene/demo/src/main/java/org/jenkinsci/plugins/sample/Hello
WorldAction.java:[5,20] cannot find symbol
[ERROR]   symbol:   class RunAction2
[ERROR]   location: package hudson.model
[ERROR] /C:/Users/jschoene/demo/src/main/java/org/jenkinsci/plugins/sample/Hello
WorldAction.java:[7,42] cannot find symbol
[ERROR]   symbol: class RunAction2
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit
ch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please rea
d the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureExc
eption
下面我列出了我的代码

HelloWorldAction.java

package org.jenkinsci.plugins.sample;

import hudson.model.Action;
import hudson.model.Run;
import hudson.model.RunAction2;

public class HelloWorldAction implements RunAction2 {

    private String name;
    private transient Run run;

    public HelloWorldAction(String Name) {
        this.name = Name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String getIconFileName() {
        return "document.png";
    }

    @Override
    public String getDisplayName() {
        return "Greeting";
    }

    @Override
    public String getUrlName() {
        return "greeting";
    }

    @Override
    public void onAttached(Run<?, ?> run) {
        this.run = run; 
    }

    @Override
    public void onLoad(Run<?, ?> run) {
        this.run = run; 
    }

    public Run getRun() { 
        return run;
    }
}
package org.jenkinsci.plugins.sample;

import hudson.Launcher;
import hudson.Extension;
import hudson.FilePath;
import hudson.util.FormValidation;
import hudson.model.AbstractProject;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.tasks.Builder;
import hudson.tasks.BuildStepDescriptor;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;

import javax.servlet.ServletException;
import java.io.IOException;
import jenkins.tasks.SimpleBuildStep;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundSetter;

public class HelloWorldBuilder extends Builder implements SimpleBuildStep {

    private final String name;
    private boolean useFrench;

    @DataBoundConstructor
    public HelloWorldBuilder(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean isUseFrench() {
        return useFrench;
    }

    @DataBoundSetter
    public void setUseFrench(boolean useFrench) {
        this.useFrench = useFrench;
    }

    @Override
    public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
        run.addAction(new HelloWorldAction(name));
        if (useFrench) {
            listener.getLogger().println("Bonjour, " + name + "!");
        } else {
            listener.getLogger().println("Hello, " + name + "!");
        }
    }

    @Symbol("greet")
    @Extension
    public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {

        public FormValidation doCheckName(@QueryParameter String value, @QueryParameter boolean useFrench)
                throws IOException, ServletException {
            if (value.length() == 0)
                return FormValidation.error(Messages.HelloWorldBuilder_DescriptorImpl_errors_missingName());
            if (value.length() < 4)
                return FormValidation.warning(Messages.HelloWorldBuilder_DescriptorImpl_warnings_tooShort());
            if (!useFrench && value.matches(".*[éáàç].*")) {
                return FormValidation.warning(Messages.HelloWorldBuilder_DescriptorImpl_warnings_reallyFrench());
            }
            return FormValidation.ok();
        }

        @Override
        public boolean isApplicable(Class<? extends AbstractProject> aClass) {
            return true;
        }

        @Override
        public String getDisplayName() {
            return Messages.HelloWorldBuilder_DescriptorImpl_DisplayName();
        }

    }

}
package org.jenkinsci.plugins.sample;
导入hudson.model.Action;
导入hudson.model.Run;
导入hudson.model.RunAction2;
公共类HelloWorldAction实现RunAction2{
私有字符串名称;
私人临时运行;
公共HelloWorldAction(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
@凌驾
公共字符串getIconFileName(){
返回“document.png”;
}
@凌驾
公共字符串getDisplayName(){
回复“问候”;
}
@凌驾
公共字符串getUrlName(){
回复“问候”;
}
@凌驾
已连接的公共void(运行){
this.run=run;
}
@凌驾
公共void onLoad(运行){
this.run=run;
}
公共运行getRun(){
回程;
}
}
HelloWorldBuilder.java

package org.jenkinsci.plugins.sample;

import hudson.model.Action;
import hudson.model.Run;
import hudson.model.RunAction2;

public class HelloWorldAction implements RunAction2 {

    private String name;
    private transient Run run;

    public HelloWorldAction(String Name) {
        this.name = Name;
    }

    public String getName() {
        return name;
    }

    @Override
    public String getIconFileName() {
        return "document.png";
    }

    @Override
    public String getDisplayName() {
        return "Greeting";
    }

    @Override
    public String getUrlName() {
        return "greeting";
    }

    @Override
    public void onAttached(Run<?, ?> run) {
        this.run = run; 
    }

    @Override
    public void onLoad(Run<?, ?> run) {
        this.run = run; 
    }

    public Run getRun() { 
        return run;
    }
}
package org.jenkinsci.plugins.sample;

import hudson.Launcher;
import hudson.Extension;
import hudson.FilePath;
import hudson.util.FormValidation;
import hudson.model.AbstractProject;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.tasks.Builder;
import hudson.tasks.BuildStepDescriptor;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;

import javax.servlet.ServletException;
import java.io.IOException;
import jenkins.tasks.SimpleBuildStep;
import org.jenkinsci.Symbol;
import org.kohsuke.stapler.DataBoundSetter;

public class HelloWorldBuilder extends Builder implements SimpleBuildStep {

    private final String name;
    private boolean useFrench;

    @DataBoundConstructor
    public HelloWorldBuilder(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean isUseFrench() {
        return useFrench;
    }

    @DataBoundSetter
    public void setUseFrench(boolean useFrench) {
        this.useFrench = useFrench;
    }

    @Override
    public void perform(Run<?, ?> run, FilePath workspace, Launcher launcher, TaskListener listener) throws InterruptedException, IOException {
        run.addAction(new HelloWorldAction(name));
        if (useFrench) {
            listener.getLogger().println("Bonjour, " + name + "!");
        } else {
            listener.getLogger().println("Hello, " + name + "!");
        }
    }

    @Symbol("greet")
    @Extension
    public static final class DescriptorImpl extends BuildStepDescriptor<Builder> {

        public FormValidation doCheckName(@QueryParameter String value, @QueryParameter boolean useFrench)
                throws IOException, ServletException {
            if (value.length() == 0)
                return FormValidation.error(Messages.HelloWorldBuilder_DescriptorImpl_errors_missingName());
            if (value.length() < 4)
                return FormValidation.warning(Messages.HelloWorldBuilder_DescriptorImpl_warnings_tooShort());
            if (!useFrench && value.matches(".*[éáàç].*")) {
                return FormValidation.warning(Messages.HelloWorldBuilder_DescriptorImpl_warnings_reallyFrench());
            }
            return FormValidation.ok();
        }

        @Override
        public boolean isApplicable(Class<? extends AbstractProject> aClass) {
            return true;
        }

        @Override
        public String getDisplayName() {
            return Messages.HelloWorldBuilder_DescriptorImpl_DisplayName();
        }

    }

}
package org.jenkinsci.plugins.sample;
进口哈德逊发射器;
导入哈德逊扩展;
导入hudson.FilePath;
导入hudson.util.FormValidation;
导入hudson.model.AbstractProject;
导入hudson.model.Run;
导入hudson.model.TaskListener;
导入hudson.tasks.Builder;
导入hudson.tasks.BuildStepDescriptor;
导入org.kohsuke.stapper.DataBoundConstructor;
导入org.kohsuke.stapper.QueryParameter;
导入javax.servlet.ServletException;
导入java.io.IOException;
导入jenkins.tasks.SimpleBuildStep;
导入org.jenkinsci.Symbol;
导入org.kohsuke.stapper.DataBoundSetter;
公共类HelloWorldBuilder扩展生成器实现SimpleBuildStep{
私有最终字符串名;
私用法语;
@数据边界构造函数
公共HelloWorldBuilder(字符串名称){
this.name=名称;
}
公共字符串getName(){
返回名称;
}
公共布尔值isUseFrench(){
返回使用法语;
}
@数据边界设置器
public void setUseFrench(布尔值useFrench){
this.usefrence=usefrence;
}
@凌驾
public void perform(运行、文件路径工作区、启动器启动器、TaskListener侦听器)抛出InterruptedException、IOException{
run.addAction(新HelloWorldAction(名称));
如果(使用法语){
listener.getLogger().println(“你好,+name+”!”;
}否则{
listener.getLogger().println(“你好,“+name+”!”);
}
}
@符号(“问候”)
@延伸
公共静态最终类描述符RIMPL扩展了BuildStepDescriptor{
公共表单验证doCheckName(@QueryParameter字符串值,@QueryParameter布尔值useFrench)
抛出IOException、ServletException{
如果(value.length()==0)
返回FormValidation.error(Messages.HelloWorldBuilder_DescriptorImpl_errors_missingName());
if(value.length()<4)
返回FormValidation.warning(Messages.HelloWorldBuilder_descriptoripl_warnings_tooShort());
如果(!useFrench&&value.matches(“.[\\\\ç].*)){
返回FormValidation.warning(Messages.HelloWorldBuilder_DescriptorImpl_warnings_reallyFrench());
}
返回FormValidation.ok();
}
@凌驾
公共布尔值不适用(类
TODO插件
待办事项
https://wiki.jenkins-ci.org/display/JENKINS/TODO+插件
麻省理工学院执照
http://opensource.org/licenses/MIT
org.jenkins-ci.plugins
结构
1.7
org.jenkins-ci.plugins.workflow
工作流步骤api
2.12
测试
org.jenkins-ci.plugins.workflow
工作流cps
2.39
测试
org.jenkins-ci.plugins.workflow
工作流作业
2.11.2
测试
org.jenkins-ci.plugins.workflow
工作流基本步骤
2.6
测试
org.jenkins-ci.plugins.workflow
工作流持久任务步骤
2.13
测试
org.jenkins-ci.plugins.workflow
工作流api
2.20
测试
org.jenkins-ci.plugins.workflow
工作流支持
2.14
测试
repo.jenkins-ci.org
https://repo.jenkins-ci.org/public/
repo.jenkins-ci.org
https://repo.jenkins-ci.org/public/
index.jelly

<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:l="/lib/layout" xmlns:st="jelly:stapler">
    <l:layout title="Greeting"> 
        <l:side-panel>
            <st:include page="sideplay.jelly" it="${it.run}" optional="true" />
        </l:side-panel>
        <l:main-panel> 
            <h1> 
                Name: ${it.name} 
            </h1>
        </l:main-panel>
    </l:layout>
</j:jelly>

名称:${it.Name}
我检查了stackoverflow上的一些其他线程,模式是找不到symbol,据我所知,类RunAction2不知怎么丢失了。但是我从jenkins教程中知道
mvn verify
应该下载所有丢失的依赖项,所以我不知道如何修复这个问题

我还尝试将
pom.xml
文件中的JDK版本更改为我的实际版本,这也没有帮助

我想这是一个很小的错误,但作为一个该死的初学者,我被困在这里。希望有人能给我指出正确的方向


提前感谢

如评论中所述,这里是解决方案:

您需要导入jenkins.model.runaction 2;而不是导入hudson.model.RunActio