在我自己的计算机上成功安装jython 2.7.0并编写了一些使用它的代码后,我试图将它安装在运行Ubuntu 14.04.2 LTS的服务器上。我的java版本是:
java version "1.8.0_51"
Java(TM) SE Runtime Environment (build 1.8.0_51-b16)
Java HotSpot(TM) 64-Bit Server VM (build 25.51-b03, mixed mode)
安装过程中的错误是:
Generating start scripts ...
Installing pip and setuptools
90 %
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/python/util/jython : Unsupported major.minor version 51.0
有趣的是,如果我以超级用户身份运行安装,然后以超级用户身份运行bin
目录中的jython可执行文件,则可以正常运行:
jython-2.7.0/bin$ sudo ./jython
Jython 2.7.0 (default:9987c746f838, Apr 29 2015, 02:25:11)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_51
Type "help", "copyright", "credits" or "license" for more information.
但是如果我尝试以普通用户身份运行jython可执行文件(以超级用户或普通用户身份安装后),那么我会得到相同的UnsupportedClassVersionError
:
jython-2.7.0/bin$ ./jython
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/python/util/jython : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: org.python.util.jython. Program will exit.
我检查了超级用户和普通用户的java版本,它完全一样。关于问题在这里的任何想法?
答案 0 :(得分:0)
Jython有一个包缓存,可以在启动时扫描jar并将一些信息保存到python.cachedir
。首次使用默认安装运行jython的用户会导致创建cachedir并最初填充 - 具有该用户的权限。在您的情况下,root的umask可能将权限设置为任何其他用户都无法读取 - 使jython类加载器认为它在读取默认jar时遇到问题。如果您第一次使用普通用户,则会看到尝试创建cachedir的权限错误。
如果您不想使用注册表文件,java属性或修改jython启动脚本为每个用户设置cachedir,那么为每个人提供对cachedir的默认rw权限就足够了。如果是这样的话就应该解决你的问题(你可能还需要+ cachedir/packages
目录):
JYTHON_HOME=$(sudo jython -c 'import java;print java.lang.System.getProperty("python.home")')
sudo chmod a+rwx ${JYTHON_HOME}/cachedir ${JYTHON_HOME}/cachedir/packages
sudo chmod -R a+rw ${JYTHON_HOME}/cachedir