我在使用 sun java 和 ubuntu 时遇到了这个非常奇怪的错误。
"java.lang.ClassNotFoundException: com.sun.security.auth.UnixPrincipal"
这个类似乎是一个特定于 sun 的类,我在 ubuntu 12.04 上有一个全新的 sun java 1.6 工作版本。 我已经确认我的 java 版本是正确的,它用于按类运行,事实上,其他版本(如 openjdk)没有干扰。
这是我的规格:
$ java -version java version "1.6.0_33" Java(TM) SE Runtime 环境(内部版本 1.6.0_33-b03) Java 热点(TM) 64 位服务器虚拟机 (内部版本 20.8-B03,混合模式)
$ lsb_release -a 没有可用的 LSB 模块。分销商编号:
Ubuntu 描述: Ubuntu 12.04 LTS 发布: 12.04 代号:
精确
错误 :
home/vagrant/development/workspace/xxxxx/build.xml:222: java.lang.NoClassDefFoundError: com/sun/security/auth/UnixPrincipal at org.apache.hadoop.security.UserGroupInformation.(用户组信息.java:246) at org.apache.hadoop.fs.FileSystem$Cache$Key.(文件系统.java:1436) at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1337) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:244) at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:122) ...原因:java.lang.ClassNotFoundException: com.sun.security.auth.UnixPrincipal at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1361) at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1311) at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1070) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) ...38 更多
"首先,我认为这只是意味着这门课不在我的太阳装置中"
但以下几点:
unzip -l/usr/lib/jvm/java-6-sun/jre/lib/rt.jar | grep UnixPrincipal
透露:
1272 2012-05-09 10:19 com/sun/security/auth/UnixPrincipal.class
并且,通过检查System.getProperties(),我发现:
java.ext.dirs=....usr/lib/jvm/java-6-sun-1.6.0.33/jre/lib/rt.jar.....
因此表明这个类在一个罐子里,这肯定在我的 java 的运行时版本中!
因此,不知何故,Java 运行时无法加载此类。 我想知道为什么?
一个小注意事项:我通过 ant 1.8 运行它。 但是,我认为这应该不会影响任何事情,因为我相信 Ant 类加载器相对稳定。
你现在可能已经解决了这个问题,但这是我最近与同样问题的纠结:
Sun java 和 gcj 都已安装。 交互式运行给了我 Sun java,UnixPrincipal
类正确加载。 非交互运行(service myservice start
)将无法正确设置JAVA_HOME
并且系统将使用gcj,并且UnixPrincipal
无法加载。 在我的服务脚本中显式设置JAVA_HOME
解决了问题。
我在尝试使用ant运行Solr时遇到了这个问题。 虽然我JAVA_HOME
为 Oracle JDK8 设置,但我相信ant
可能已经在我的 Ubuntu 15.10 计算机上找到了 openjdk 安装。
该问题的解决方案是在<java>
任务中包含fork="true"
选项:
<java fork="true" classname="com.mycompany.MyMainClassName">
通过包含fork="true"
选项,它使用 java
命令创建了第二个 JVM,该命令正确找到了我的 Oracle JDK。 如果您不包含 fork="true"
选项,那么用户程序将在 ant
正在使用的同一 JVM 中运行(这可能不是您想要的 JDK)。
作为参考,完整的错误堆栈跟踪为:
[java] java.lang.NoClassDefFoundError: com/sun/security/auth/UnixPrincipal
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:195)
[java] at org.apache.tools.ant.taskdefs.Java.run(Java.java:772)
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:222)
[java] at org.apache.tools.ant.taskdefs.Java.executeJava(Java.java:136)
[java] at org.apache.tools.ant.taskdefs.Java.execute(Java.java:109)
[java] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[java] at java.lang.reflect.Method.invoke(Method.java:497)
[java] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[java] at org.apache.tools.ant.Task.perform(Task.java:348)
[java] at org.apache.tools.ant.Target.execute(Target.java:435)
[java] at org.apache.tools.ant.Target.performTasks(Target.java:456)
[java] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405)
[java] at org.apache.tools.ant.Project.executeTarget(Project.java:1376)
[java] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[java] at org.apache.tools.ant.Project.executeTargets(Project.java:1260)
[java] at org.apache.tools.ant.Main.runBuild(Main.java:853)
[java] at org.apache.tools.ant.Main.startAnt(Main.java:235)
[java] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:285)
[java] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:112)
[java] Caused by: java.lang.NoClassDefFoundError: com/sun/security/auth/UnixPrincipal
[java] at org.apache.hadoop.security.UserGroupInformation.<clinit>(UserGroupInformation.java:336)
[java] at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:1765)
[java] at org.apache.hadoop.fs.FileSystem$Cache$Key.<init>(FileSystem.java:1758)
[java] at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:1626)
[java] at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:254)
[java] at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:123)
[java] at com.touchcommerce.engagementloader.EngagementLoader.getFileSystem(EngagementLoader.java:342)
[java] at com.touchcommerce.engagementloader.EngagementLoader.load(EngagementLoader.java:364)
[java] at com.touchcommerce.engagementloader.EngagementLoader.main(EngagementLoader.java:454)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[java] at java.lang.reflect.Method.invoke(Method.java:497)
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.run(ExecuteJava.java:218)
[java] at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ExecuteJava.java:153)
[java] ... 21 more
[java] Caused by: java.lang.ClassNotFoundException: com.sun.security.auth.UnixPrincipal
[java] at org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1388)
[java] at org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1337)
[java] at org.apache.tools.ant.AntClassLoader.loadClass(AntClassLoader.java:1095)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
[java] ... 36 more
[java] Java Result: -1