Hi Marc,

The build is failing in the Enunciate plugin during the security-admin
 module’s package phase—not during the main Java compilation. I reproduced
it and confirmed a workaround.

Workaround is to disable Enunciate’s source path and build Ranger using the
command below.

mvn -Pall -DskipTests=true -Denunciate.disable.sourcepath=true clean compile
package

The 2.7.0 release is compatible with these versions of the various
components:

   - Java: JDK 8
   - Python3: 3.10.12
   - Databases [Ranger and Ranger KMS]:
      - MariaDB: 10.7.3
      - Postgres: 12
      - Oracle: 23.6
   - Apache Solr: 8.11.3


Hope this helps

Regards
Nixon


On Thu, Jul 30, 2026 at 7:50 PM Marc Hoppins <[email protected]> wrote:

> INTERNAL
>
> Hi,
>
> I hope someone can help. I know that the ranger email groups are seriously
> underpopulated.
>
> I am NOT a maven or java person.  I am just a regular admin trying to get
> a plugin built for use.
>
> The build fails (for 2.6, 2.7) here:
>
> [WARNING] [ENUNCIATE] [javac] [ERROR]
> com.webcohesion.enunciate.Enunciate$URLFileObject[file:/home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/credentialbuilder/2.7.0/credentialbuilder-2.7.0-sources.jar!/org/apache/ranger/credentialapi/CredentialReader.java]:30:8
> /home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/credentialbuilder/2.7.0/credentialbuilder-2.7.0-sources.jar!/org/apache/ranger/credentialapi/CredentialReader.java:30:
> error: duplicate class: org.apache.ranger.credentialapi.CredentialReader
> [WARNING] [ENUNCIATE] [javac]
> /home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/credentialbuilder/2.7.0/credentialbuilder-2.7.0-sources.jar!/org/apache/ranger/credentialapi/CredentialReader.java:30:
> error: duplicate class: org.apache.ranger.credentialapi.CredentialReader
> [WARNING] [ENUNCIATE] [javac] public class CredentialReader {
> [WARNING] [ENUNCIATE] [javac]        ^
> [WARNING] [ENUNCIATE] [javac] [ERROR]
> com.webcohesion.enunciate.Enunciate$URLFileObject[file:/home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/ranger-metrics/2.7.0/ranger-metrics-2.7.0-sources.jar!/org/apache/ranger/metrics/source/RangerMetricsContainerSource.java]:22:37
> /home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/ranger-metrics/2.7.0/ranger-metrics-2.7.0-sources.jar!/org/apache/ranger/metrics/source/RangerMetricsContainerSource.java:22:
> error: package com.google.common.annotations does not exist
> [WARNING] [ENUNCIATE] [javac]
> /home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/ranger-metrics/2.7.0/ranger-metrics-2.7.0-sources.jar!/org/apache/ranger/metrics/source/RangerMetricsContainerSource.java:22:
> error: package com.google.common.annotations does not exist
> [WARNING] [ENUNCIATE] [javac] import
> com.google.common.annotations.VisibleForTesting;
> [WARNING] [ENUNCIATE] [javac]                                     ^
> [WARNING] [ENUNCIATE] [javac] [ERROR]
> com.webcohesion.enunciate.Enunciate$URLFileObject[file:/home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/ranger-metrics/2.7.0/ranger-metrics-2.7.0-sources.jar!/org/apache/ranger/metrics/source/RangerMetricsContainerSource.java]:94:6
> /home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/ranger-metrics/2.7.0/ranger-metrics-2.7.0-sources.jar!/org/apache/ranger/metrics/source/RangerMetricsContainerSource.java:94:
> error: cannot find symbol
> [WARNING] [ENUNCIATE] [javac]
> /home/marc.hoppins.ipa/.m2/repository/org/apache/ranger/ranger-metrics/2.7.0/ranger-metrics-2.7.0-sources.jar!/org/apache/ranger/metrics/source/RangerMetricsContainerSource.java:94:
> error: cannot find symbol
> [WARNING] [ENUNCIATE] [javac]     @VisibleForTesting
> [WARNING] [ENUNCIATE] [javac]      ^
> [WARNING] [ENUNCIATE] [javac]   symbol:   class VisibleForTesting
> [WARNING] [ENUNCIATE] [javac]   location: class
> org.apache.ranger.metrics.source.RangerMetricsContainerSource
> [WARNING] [ENUNCIATE] [javac] [NOTE]
> com.webcohesion.enunciate.Enunciate$URLFileObject[file:/home/marc.hoppins.ipa/apache-ranger-2.7.0/security-admin/src/main/java/org/apache/ranger/common/db/RangerTransactionSynchronizationAdapter.java]:-1:-1
> Note: Some input files use or override a deprecated API.
> [WARNING] [ENUNCIATE] [javac] Note: Some input files use or override a
> deprecated API.
> [WARNING] [ENUNCIATE] [javac] [NOTE]
> com.webcohesion.enunciate.Enunciate$URLFileObject[file:/home/marc.hoppins.ipa/apache-ranger-2.7.0/security-admin/src/main/java/org/apache/ranger/common/db/RangerTransactionSynchronizationAdapter.java]:-1:-1
> Note: Recompile with -Xlint:deprecation for details.
> [WARNING] [ENUNCIATE] [javac] Note: Recompile with -Xlint:deprecation for
> details.
> [WARNING] [ENUNCIATE] [javac] [NOTE]
> com.webcohesion.enunciate.Enunciate$URLFileObject[file:/home/marc.hoppins.ipa/apache-ranger-2.7.0/security-admin/src/main/java/org/apache/ranger/AccessAuditsService.java]:-1:-1
> Note: Some input files use unchecked or unsafe operations.
> [WARNING] [ENUNCIATE] [javac] Note: Some input files use unchecked or
> unsafe operations.
> [WARNING] [ENUNCIATE] [javac] [NOTE]
> com.webcohesion.enunciate.Enunciate$URLFileObject[file:/home/marc.hoppins.ipa/apache-ranger-2.7.0/security-admin/src/main/java/org/apache/ranger/AccessAuditsService.java]:-1:-1
> Note: Recompile with -Xlint:unchecked for details.
> [WARNING] [ENUNCIATE] [javac] Note: Recompile with -Xlint:unchecked for
> details.
>
> But I have no idea why/where com.google.commons.annotations appears from
> guava and I have no clue as to why a class would get classed as
> 'duplicated'.
>
> What I DID see was this for CredentialReader.java:
>
> package org.apache.ranger.credentialapi;
> import java.util.ArrayList;
> import java.util.List;
> import org.apache.commons.lang.StringUtils;
> import org.apache.hadoop.conf.Configuration;
> import org.apache.hadoop.security.alias.CredentialProvider;
> import org.apache.hadoop.security.alias.CredentialProviderFactory;
> import org.apache.hadoop.security.alias.JavaKeyStoreProvider;
> public class CredentialReader {
>
>         public static String getDecryptedString(String
> CrendentialProviderPath,String alias, String storeType) {
>                   String credential=null;
>                   try{
>                           if(CrendentialProviderPath==null ||
> alias==null||CrendentialProviderPath.trim().isEmpty()||alias.trim().isEmpty()){
>                                   return null;
>                           }
>                           char[] pass = null;
>                           Configuration conf = new Configuration();
>                           String
> crendentialProviderPrefixJceks=JavaKeyStoreProvider.SCHEME_NAME + "://file";
>                           String
> crendentialProviderPrefixLocalJceks="localjceks://file";
>
> crendentialProviderPrefixJceks=crendentialProviderPrefixJceks.toLowerCase();
>
>                           String crendentialProviderPrefixBcfks= "bcfks" +
> "://file";
>                           String crendentialProviderPrefixLocalBcfks=
> "localbcfks" + "://file";
>
> crendentialProviderPrefixBcfks=crendentialProviderPrefixBcfks.toLowerCase();
>
> crendentialProviderPrefixLocalBcfks=crendentialProviderPrefixLocalBcfks.toLowerCase();
>
>
> CrendentialProviderPath=CrendentialProviderPath.trim();
>                           alias=alias.trim();
>
> if(CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixJceks)
> ||
>
> CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixLocalJceks)
> ||
>
> CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixBcfks)
> ||
>
> CrendentialProviderPath.toLowerCase().startsWith(crendentialProviderPrefixLocalBcfks)){
>
> conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
>
> //UserProvider.SCHEME_NAME + ":///," +
>                                                   CrendentialProviderPath);
>                           }else{
>
> if(CrendentialProviderPath.startsWith("/")){
>
> if(StringUtils.equalsIgnoreCase(storeType, "bcfks")) {
>
> conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
> CrendentialProviderPath);
>                                           } else {
>
> conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
>
> //UserProvider.SCHEME_NAME + ":///," +
>
> JavaKeyStoreProvider.SCHEME_NAME + "://file" + CrendentialProviderPath);
>                                           }
>
>                                   }else{
>
> conf.set(CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH,
>
> //UserProvider.SCHEME_NAME + ":///," +
>
> JavaKeyStoreProvider.SCHEME_NAME + "://file/" + CrendentialProviderPath);
>                                   }
>                           }
>                           List<CredentialProvider> providers =
> CredentialProviderFactory.getProviders(conf);
>                           List<String> aliasesList=new ArrayList<String>();
>                           CredentialProvider.CredentialEntry
> credEntry=null;
>                           for(CredentialProvider provider: providers) {
>                       //System.out.println("Credential Provider :" +
> provider);
>                                   aliasesList=provider.getAliases();
>                                   if(aliasesList!=null &&
> aliasesList.contains(alias.toLowerCase())){
>                                           credEntry=null;
>                                           credEntry=
> provider.getCredentialEntry(alias.toLowerCase());
>                                           pass = credEntry.getCredential();
>                                           if(pass!=null && pass.length>0){
>
> credential=String.valueOf(pass);
>                                                   break;
>                                           }
>                                   }
>                           }
>                   }catch(Exception ex){
>                           ex.printStackTrace();
>                           credential=null;
>                   }
>                   return credential;
>           }
> }
>
> Is ANYONE aware that Crendential is not Credential?
>
> If someone knows how to resolve the build errors, I'd appreciate the
> assist. I do not relay care to learn java, or more of maven other than
> build.use. I would prefer to see released binary tarballs but what the hey.
>
> Marc
>

Reply via email to