我在sun java和ubuntu中遇到了这个非常奇怪的错误。
“抛出java.lang.ClassNotFoundException: com.sun.security.auth.UnixPrincipal“
这个类似乎是一个特定于太阳的类,我在ubuntu 12.04上有一个全新的工作版sun java 1.6。我已经确认我的java版本是正确的,用于按类运行,事实上,其他版本(如openjdk)不会干扰。
以下是我的规格:
$ java -version java version“1.6.0_33”Java(TM)SE Runtime 环境(build 1.6.0_33-b03)Java HotSpot(TM)64位服务器VM (建立20.8-b03,混合模式)
$ lsb_release -a没有LSB模块可用。经销商ID:
Ubuntu描述:Ubuntu 12.04 LTS版本:12.04代号:
精确
错误:
家/流浪/开发/工作区/ XXXXX / build.xml中:222: java.lang.NoClassDefFoundError:com / sun / security / auth / UnixPrincipal 在org.apache.hadoop.security.UserGroupInformation。(UserGroupInformation.java:246) 在org.apache.hadoop.fs.FileSystem $ Cache $ Key。(FileSystem.java:1436) 在org.apache.hadoop.fs.FileSystem $ Cache.get(FileSystem.java:1337) 在org.apache.hadoop.fs.FileSystem.get(FileSystem.java:244) 在org.apache.hadoop.fs.FileSystem.get(FileSystem.java:122)...引起:java.lang.ClassNotFoundException: com.sun.security.auth.UnixPrincipal 在org.apache.tools.ant.AntClassLoader.findClassInComponents(AntClassLoader.java:1361) 在org.apache.tools.ant.AntClassLoader.findClass(AntClassLoader.java:1311) 在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-太阳1.6.0.33 / JRE / LIB / rt.jar中.....
这样表明这个类是在一个jar中,肯定是我的java的Runtime版本!
因此,不知何故,java运行时无法加载此类。我想知道为什么 ?
一个小注:我通过蚂蚁1.8运行它。但是,我不认为这会产生任何影响,因为我认为Ant类加载器相对稳定。
答案 0 :(得分:1)
你现在可能已经解决了这个问题,但这是我最近纠结的同样问题:
安装了Sun java和gcj。以交互方式运行,为我提供了Sun java,UnixPrincipal
类正确加载。非交互式运行(service myservice start
)将无法正确设置JAVA_HOME
,系统将使用gcj而UnixPrincipal
无法加载。在我的服务脚本中明确设置JAVA_HOME
解决了问题。
答案 1 :(得分:0)
我在尝试使用ant运行Solr时遇到了这个问题。虽然我为Oracle JDK8设置了JAVA_HOME
,但我相信ant
可能在我的Ubuntu 15.10计算机上找到了openjdk安装。
问题的解决方案是在fork="true"
任务中包含<java>
选项:
<java fork="true" classname="com.mycompany.MyMainClassName">
通过包含fork="true"
选项,它使用正确找到我的Oracle JDK的java
命令创建了第二个JVM。如果不包含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