Jenkins - 在不使用Descriptor的情况下持久保存插件设置

时间:2016-02-19 10:09:30

标签: java jenkins continuous-integration jenkins-plugins

我开发了一个简单的Jenkins插件。这是插件类:

@Extension
public class Plugin extends hudson.Plugin {
    private static String URL;

    @Override
    public void configure(StaplerRequest req, JSONObject formData) throws IOException, ServletException, Descriptor.FormException {
        super.configure(req, formData);
        URL = formData.getString("url");
        save();
    }

    @Override
    public void start() throws Exception {
        super.start();
        load();
    }
}

此外,我在config.groovy页面上有/configure描述网址字段:

package com.example.Plugin

f = namespace("lib/form")

f.section(title: "My settings section") {
    f.entry(title: "URL", field: "url") {
        f.textbox(value: my.URL) {
        }
    }
}

问题是当我重新启动Jenkins时,我的URL设置丢失了。如何在不为我的插件实现 Descriptor 类的情况下继续

我尝试将load()方法调用添加到configure()Plugin构造函数。我还尝试覆盖getConfigXml()这样的方法:

@Override
protected XmlFile getConfigXml() {
    return new XmlFile(Jenkins.XSTREAM, new File(Jenkins.getInstance().getRootDir(), getClass().getName()+".xml"));
}

但它没有成功。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

最后我找到了解决这个问题的方法。好像Jenkins不能持久化静态类字段。我的Plugin课程现在看起来像这样:

@Extension
public class Plugin extends hudson.Plugin {
    private String url;
    private static Plugin INSTANCE;

    @Override
    public void configure(StaplerRequest req, JSONObject formData) throws IOException, ServletException, Descriptor.FormException {
        super.configure(req, formData);
        url = formData.getString("url");
        save();
    }

    @Override
    public void start() throws Exception {
        super.start();
        load();
        INSTANCE = Jenkins.getInstance().getPlugin(Plugin.class);
    }

    static String getUrl() {
        if (INSTANCE == null) {
            throw new IllegalStateException("Plugin instance is not defined yet");
        }
        return INSTANCE.url;
    }
}