Custom single select field through Jira Plugin

I would like to create a single select custom field through jira plugin tried below code but I am unable to see field in customfields section after deploying the plugin

package com.zscaler.select2plugin.jira.customfields;
import com.atlassian.jira.component.ComponentAccessor;
import com.atlassian.jira.issue.customfields.manager.GenericConfigManager;
import com.atlassian.jira.issue.customfields.impl.FieldValidationException;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.issue.customfields.manager.OptionsManager;
import com.atlassian.jira.issue.customfields.persistence.PersistenceFieldType;
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 java.util.Collections;
import java.util.List;
import org.apache.commons.collections.MultiMap;
import java.util.Map;
import com.atlassian.jira.issue.customfields.impl.AbstractSingleFieldType;
import com.atlassian.jira.issue.customfields.view.CustomFieldParams;
import com.atlassian.jira.issue.customfields.option.Options;
import com.atlassian.jira.issue.customfields.option.Option;
import com.atlassian.jira.issue.customfields.converters.StringConverter;
import com.atlassian.jira.issue.customfields.persistence.CustomFieldValuePersister;
import com.atlassian.jira.issue.context.IssueContext;
import com.atlassian.jira.issue.Issue;
import com.atlassian.jira.util.ErrorCollection;
import com.atlassian.jira.util.ErrorCollection.Reason;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;

public class select2singleselect extends AbstractSingleFieldType<String> {
    OptionsManager optionsManager;
    protected select2singleselect(CustomFieldValuePersister customFieldValuePersister, GenericConfigManager genericConfigManager) {
        super(customFieldValuePersister, genericConfigManager);
    }

    @Nonnull
    @Override
    protected PersistenceFieldType getDatabaseType() {
        return PersistenceFieldType.TYPE_UNLIMITED_TEXT;
    }

    @Nullable
    @Override
    protected Object getDbValueFromObject(String s) {
        return s;
    }

    @Nullable
    @Override
    protected String getObjectFromDbValue(@Nonnull Object o) throws FieldValidationException {
        return String.valueOf(o);
    }

    @Override
    public String getStringFromSingularObject(String s) {
        return s;
    }

    @Override
    public String getSingularObjectFromString(String s) throws FieldValidationException {
        return s;
    }

    @Override
    public Map<String, Object> getVelocityParameters(
            Issue issue,
            CustomField customField,
            FieldLayoutItem fieldLayoutItem) {
        // Call the parent method to ensure default parameters are set
        Map<String, Object> velocityParams = super.getVelocityParameters(issue, customField, fieldLayoutItem);

        // Fetch options based on the custom field's context
        List<Option> options = getOptionsForContext(customField, issue);
        // Add options to the Velocity context
        velocityParams.put("customFieldOptions", options);
        // Add the current value if it exists
        Object currentValue = customField.getValue(issue);
        if (currentValue instanceof Option) {
            velocityParams.put("value", currentValue);
        }
        return velocityParams;
    }
    private List<Option> getOptionsForContext(CustomField customField, Issue issue) {
        // Fetch the configuration for the custom field based on the issue's context
        FieldConfig fieldConfig = customField.getRelevantConfig(issue);
        if (fieldConfig != null) {
            OptionsManager optionsManager = ComponentAccessor.getOptionsManager();
            return optionsManager.getOptions(fieldConfig).getRootOptions();
        }
        return Collections.emptyList();
    }
}