How to create Jira create custom field programmatically

In order to create a  jira custom field type, you should be aware of basic plugin development.

Please follow the following steps to create an advanced jira custom field.

Create a basic Jira plugin skeleton. For creating Jira Plugin please refer to the given link

After creating a Basic plugin skeleton modify your atlassian-plugin.xml and add the following code in your atlassian-plugin.xml.

After creating a Basic plugin skeleton modify your atlassian-plugin.xml and add the following code in your atlassian-plugin.xml. <customfield-type key=”Jira-Cf-Type-field” name=”Jira-Select CFType” class=”com.atlassian.jira.plugin.customfield.JiraCustomFieldType”><description>Create Your Own Advance Custom Field Type</description><resource type=”velocity” name=”view” location=”templates/plugins/fields/view/view-basictext.vm”/><resource type=”velocity” name=”edit” location=”templates/edit- jiraselectcftype.vm”/><resource type=”velocity” name=”xml” location=”templates/plugins/fields/xml/xml-basictext.vm”/></customfield-type>

com.atlassian.jira.plugin.customfield.JiraCustomFieldType class which extends an available CustomField Class to provide an entry point for the custom field.

Resources “Represents the various vm files which are executed for rendering the field.

    1. In order to create the custom field type, first you have to create the class representing the field.JiraCustomFieldType.javapackage com.atlassian.jira.plugin.customfield; import java.util.HashMap;import java.util.Map;

      import com.atlassian.jira.issue.Issue;

      import com.atlassian.jira.issue.customfields.impl.SelectCFType;

      import com.atlassian.jira.issue.customfields.manager.GenericConfigManager;

      import com.atlassian.jira.issue.customfields.manager.OptionsManager;

      import com.atlassian.jira.issue.customfields.option.Option;

      import com.atlassian.jira.issue.customfields.option.Options;

      import com.atlassian.jira.issue.customfields.persistence.CustomFieldValuePersister;

      import com.atlassian.jira.issue.customfields.view.CustomFieldParams;

      import com.atlassian.jira.issue.fields.CustomField;

      import com.atlassian.jira.issue.fields.config.FieldConfig;

      import com.atlassian.jira.issue.fields.layout.field.FieldLayoutItem;



      import com.atlassian.jira.util.ErrorCollection;

      public class JiraCustomFieldType extends SelectCFType {

      private final OptionsManager optionsManager;

      public JiraCustomFieldType(CustomFieldValuePersister customFieldValuePersister,

      OptionsManager optionsManager,

      GenericConfigManager genericConfigManager,

      JiraBaseUrls jiraBaseUrls) {

      super(customFieldValuePersister, optionsManager, genericConfigManager, jiraBaseUrls);





      public Map getVelocityParameters(Issue issue, CustomField field,

      FieldLayoutItem fieldLayoutItem) {

      Map parameters = super.getVelocityParameters(issue, field, fieldLayoutItem);

      FieldConfig fieldConfig = null;

      if(issue == null)


      fieldConfig = field.getReleventConfig(new SearchContextImpl());

      System.out.println(“=========fieldConfig if” + fieldConfig);

      } else


      fieldConfig = field.getRelevantConfig(issue);

      System.out.println(“======fieldConfig else” + fieldConfig);


      Options options = this.optionsManager.getOptions(fieldConfig);

      if (options.isEmpty()) {

      this.optionsManager.createOption(fieldConfig, null, new Long(1), “Option-One”);

      this.optionsManager.createOption(fieldConfig, null, new Long(2), “Option-Two”);


      options = this.optionsManager.getOptions(fieldConfig);

      Map<Long, String> results = new HashMap<Long, String>();

      Long selectedId= (long) -1;

      boolean selected = false;

      Object value = field.getValue(issue);

      System.out.println(“== value” + value);

      if (value!=null) {



      for (Option option : (Iterable<Option>) options) {

      results.put(option.getOptionId(), option.getValue());

      if (selected && value.toString().equals(option.getValue())) {

      selectedId = option.getOptionId();

      System.out.println(“selectedId======== : “ +selectedId);



      System.out.println(“==results== : “ +results);

      parameters.put(“results”, results);

      parameters.put(“selectedId”, selectedId); 

      return parameters;



    2. Create a template to render the field on issue screen.templates/edit- jiraselectcftype.vm#* @vtlvariable name=”results” type=”java.util.Map” *##* @vtlvariable name=”selectedId” type=”java.lang.String” *##controlHeader ($action $ $ $fieldLayoutItem.required $displayParameters.noHeader)<head>$webResourceManager.requireResource(“com.atlassian.auiplugin:aui-select2”)


<select name=”$” id=”$” class=”select”>

<option value=””>Select</option>

#foreach ($mapEntry in $results.entrySet())

#if ( $selectedId == $mapEntry.key )

<option selected=”selected” value=”$mapEntry.key”>$mapEntry.value</option>


<option value=”$mapEntry.key”>$mapEntry.value</option>




    1. After creating your class and template compile your code and go to browser and access your local Jira.
    2. How to check your custom field in Jira?
Here are the steps to create jira custom field in Jira.

Now go to the * section in Jira and select custom field and add your custom field on your Jira issue screens.

jira create custom field programtically

Click on Add Custom field.

jira create custom field programmatically

Select Advance from popup.

jira create custom field programmatically

Search for your own custom field.

jira create custom field programmatically

Click on create to set your Jira Custom field. 

Posted in Agile, AGILE Tools, J2EE, JAVA, Java Script, JIRA, JIRA on Demand. Tagged with , , , .

Leave a Reply

Your email address will not be published. Required fields are marked *