使用Groovy脚本配置Nexus3 LDAP遇类解析错误,求解决办法
Nexus OSS 3.42.0-01 Groovy脚本配置LDAP类无法解析问题解决
问题描述
安装Sonatype Nexus OSS 3.42.0-01后,尝试通过Groovy脚本自动化配置LDAP,编写的脚本如下:
import org.sonatype.nexus.ldap.persist.LdapConfigurationManager import org.sonatype.nexus.ldap.persist.entity.LdapConfiguration import org.sonatype.nexus.ldap.persist.entity.Connection import org.sonatype.nexus.ldap.persist.entity.Mapping def ldapConfigMgr = container.lookup(LdapConfigurationManager.class.getName()); def ldapConfig = new LdapConfiguration() ldapConfig.setName("MYLDAP") // Connection connection = new Connection() connection.setHost(new Connection.Host(Connection.Protocol.valueOf("ldaps"), "192.168.10.100", Integer.valueOf("636"))) connection.setAuthScheme("simple") connection.setSystemUsername("uid=appauth,ou=auth,ou=nexus_cicd,ou=Applications,dc=my,dc=domain,dc=local") connection.setSystemPassword("***********") connection.setSearchBase("dc=my,dc=domain,dc=local") connection.setConnectionTimeout(30) connection.setConnectionRetryDelay(300) connection.setMaxIncidentsCount(3) connection.setUseTrustStore(Boolean.valueOf("False")) ldapConfig.setConnection(connection) // Mapping mapping = new Mapping() mapping.setUserBaseDn("ou=People") mapping.setLdapFilter("") mapping.setUserObjectClass("InetOrgPerson") mapping.setUserIdAttribute("uid") mapping.setUserRealNameAttribute("cn") mapping.setEmailAddressAttribute("mail") // MStatic Mapping mapping.setLdapGroupsAsRoles(true) mapping.setGroupBaseDn("ou=groups,ou=nexus_cicd,ou=Apllications") mapping.setGroupObjectClass("groupOfNames") mapping.setGroupIdAttribute("cn") mapping.setGroupMemberAttribute("member") mapping.setGroupMemberFormat("uid=${username},ou=People,dc=my,dc=domain,dc=local") mapping.setUserSubtree("True") mapping.setGroupSubtree("False") ldapConfig.setMapping(mapping) ldapConfigMgr.addLdapServerConfiguration(ldapConfig)
直接在系统环境运行脚本时,收到类无法解析错误:
# groovy /tmp/script/ldap.groovy org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: /tmp/script/ldap.groovy: 3: unable to resolve class org.sonatype.nexus.ldap.persist.entity.Connection @ line 3, column 1. import org.sonatype.nexus.ldap.persist.entity.Connection ^ /tmp/script/ldap.groovy: 1: unable to resolve class org.sonatype.nexus.ldap.persist.LdapConfigurationManager @ line 1, column 1. import org.sonatype.nexus.ldap.persist.LdapConfigurationManager ^ /tmp/script/ldap.groovy: 2: unable to resolve class org.sonatype.nexus.ldap.persist.entity.LdapConfiguration @ line 2, column 1. import org.sonatype.nexus.ldap.persist.entity.LdapConfiguration ^ /tmp/script/ldap.groovy: 4: unable to resolve class org.sonatype.nexus.ldap.persist.entity.Mapping @ line 4, column 1. import org.sonatype.nexus.ldap.persist.entity.Mapping ^ /tmp/script/ldap.groovy: 16: unable to resolve class Connection.Host @ line 16, column 20. connection.setHost(new Connection.Host(Connection.Protocol.valueOf("ldaps"), "10.234.254.9", Integer.valueOf("636"))) ^ 5 errors
核心原因
直接在系统Groovy环境运行脚本,无法访问Nexus内部的LDAP私有类——这些类仅存在于Nexus的运行时类路径中,系统Groovy默认无法加载。
解决步骤
1. 使用Nexus内置脚本控制台执行
Nexus官方提供了内置的脚本管理控制台(访问路径:http://你的Nexus地址/#admin/system/scripts),在这里创建Groovy脚本并执行,Nexus会自动加载内部类路径,无需手动处理Jar包,这是最安全可靠的方式。
2. 修正脚本中的错误
原脚本存在变量声明、拼写、语法冗余等问题,修正后的可用版本如下:
import org.sonatype.nexus.ldap.persist.LdapConfigurationManager import org.sonatype.nexus.ldap.persist.entity.LdapConfiguration import org.sonatype.nexus.ldap.persist.entity.Connection import org.sonatype.nexus.ldap.persist.entity.Mapping def ldapConfigMgr = container.lookup(LdapConfigurationManager.class.getName()); def ldapConfig = new LdapConfiguration() ldapConfig.setName("MYLDAP") // Connection配置 def connection = new Connection() connection.setHost(new Connection.Host(Connection.Protocol.LDAPS, "192.168.10.100", 636)) connection.setAuthScheme("simple") connection.setSystemUsername("uid=appauth,ou=auth,ou=nexus_cicd,ou=Applications,dc=my,dc=domain,dc=local") connection.setSystemPassword("***********") connection.setSearchBase("dc=my,dc=domain,dc=local") connection.setConnectionTimeout(30) connection.setConnectionRetryDelay(300) connection.setMaxIncidentsCount(3) connection.setUseTrustStore(false) ldapConfig.setConnection(connection) // 用户与组映射配置 def mapping = new Mapping() mapping.setUserBaseDn("ou=People") mapping.setLdapFilter("") mapping.setUserObjectClass("InetOrgPerson") mapping.setUserIdAttribute("uid") mapping.setUserRealNameAttribute("cn") mapping.setEmailAddressAttribute("mail") // 组映射配置 mapping.setLdapGroupsAsRoles(true) mapping.setGroupBaseDn("ou=groups,ou=nexus_cicd,ou=Applications") // 修正拼写错误:Apllications→Applications mapping.setGroupObjectClass("groupOfNames") mapping.setGroupIdAttribute("cn") mapping.setGroupMemberAttribute("member") mapping.setGroupMemberFormat("uid=${username},ou=People,dc=my,dc=domain,dc=local") mapping.setUserSubtree(true) mapping.setGroupSubtree(false) ldapConfig.setMapping(mapping) ldapConfigMgr.addLdapServerConfiguration(ldapConfig)
3. Jar包相关说明
Nexus的LDAP相关Jar包位于安装目录的system/org/sonatype/nexus/nexus-ldap-common路径下(如nexus-ldap-common-3.42.0-01.jar),但不建议手动添加到系统Groovy类路径——这种方式依赖Nexus内部类结构,版本变更后极易出错,官方推荐使用内置脚本控制台。
额外建议
- 执行脚本前,先在Nexus UI中手动配置并测试LDAP连通性,确认服务器地址、账号密码、DN路径等信息正确。
- 脚本执行后,可在LDAP配置页面查看是否成功创建配置,或通过脚本返回结果验证。
内容的提问来源于stack exchange,提问作者Marco Ferrara
相关产品推荐
相关产品推荐

