我需要知道启动Hudson的机制和流程,所以我可以弄清楚出了什么问题。当您输入
时nohup java -jar $HUDSON_WAR > $HUDSON_LOG 2>&1 &
(当然,使用这些变量的实际值),到底发生了什么?我已经是一名软件工程师已有10多年,但主要是嵌入式软件,而Web服务则不在我的领域。我不认为它有所作为,但我在RHEL 5上运行Hudson。它不使用tomcat或apache;它作为独立服务运行。访问了哪些文件以及原因?
以下是失败的具体内容:我下载了一个插件,在完成下载后我停止了然后重新启动了hudson,因为我之前做了很多次。但是,这一次,当我尝试访问Hudson主页时,我得到了
Error 404
Exception:
Stacktrace:
(none)
我怀疑是一个权限问题,因为我注意到HUDSON_HOME中的一些东西都归root所有,所以我递归chown并chgrp该目录以使hudson拥有它。这还没有解决问题。我尝试恢复以前的hudson.war,但得到了相同的行为。我注意到的一件事是,在我启动之后,如果我进入网页,我会看到Hudson的“启动”页面,然后切换到错误404.我尝试使用不同的端口号启动Hudson并获得了同样的行为。我在同一台服务器上访问Web界面来源控制没有问题。
更新:我仍然怀疑权限问题。重新启动Hudson的最后一个人可能是root用户。
Update[2]: Excerpt from hudson.log:
[Winstone 2010/10/21 16:05:17] - Beginning extraction from war file
hudson home directory: /home/hudson
[Winstone 2010/10/21 16:05:17] - HTTP Listener started: port=8080
[Winstone 2010/10/21 16:05:17] - AJP13 Listener started: port=8009
Using one-time self-signed certificate
[Winstone 2010/10/21 16:05:17] - Error starting listener instance
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:44)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:516)
at winstone.Launcher.spawnListener(Launcher.java:232)
at winstone.Launcher.<init>(Launcher.java:205)
at winstone.Launcher.main(Launcher.java:391)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:600)
at Main.main(Main.java:200)
Caused by: java.lang.NoClassDefFoundError: sun.security.x509.CertAndKeyGen
at winstone.ssl.HttpsListener.<init>(HttpsListener.java:111)
... 12 more
Caused by: java.lang.ClassNotFoundException: sun.security.x509.CertAndKeyGen
at java.lang.ClassNotFoundException.<init>(ClassNotFoundException.java:77)
at java.net.URLClassLoader.findClass(URLClassLoader.java:385)
at java.lang.ClassLoader.loadClass(ClassLoader.java:653)
at java.lang.ClassLoader.loadClass(ClassLoader.java:619)
... 13 more
答案 0 :(得分:2)
我只是在这里猜测,但你可能没有运行正确的Java二进制文件。
通常在Linux上,/usr/bin
中的java二进制文件是gcc Java实现或OpenJDK包。我过去遇到麻烦,这些Java软件包运行得不够好。如果安装了 Sun Oracle JDK,则可能在/usr/java
。我建议将JAVA_HOME设置为/usr/java/default
,并确保在启动Hudson时正在运行正确的java运行时。
export JAVA_HOME=/usr/java/default
nohup $JAVA_HOME/bin/java -jar $HUDSON_WAR > $HUDSON_LOG 2>&1 &
就个人而言,我认为使用Hudson提供的init脚本来启动和停止Hudson更容易。该脚本使用中央配置文件,并确保Hudson作为正确的用户运行。
sudo /etc/init.d/hudson start
另外,请检查HUDSON_LOG和/或/var/log/hudson/hudson.log
是否有错误。如果您最近安装的插件存在问题,可以通过移开[plugin]
[plugin].hpi
文件夹和HUDSON_HOME/plugins
文件来停用该插件
答案 1 :(得分:1)
Hudson故障排除通常是通过使用Groovy脚本的Manage Hudson界面完成的。此外,调试日志记录最有可能。引用“如何添加记录器”页面:“在用户列表中告诉我们您的问题的症状,我们应该能够告诉您需要查看的位置。此外,这实际上只是java的一个包装器。 util.logging包,所以如果你用Java编程,你可能会猜到要看什么。“他们正在谈论的用户列表是邮件列表。
如何添加新的/更多记录器:http://wiki.hudson-ci.org/display/HUDSON/Logging
如何进入用户列表:http://wiki.hudson-ci.org/display/HUDSON/Mailing+List
管理细节:http://wiki.hudson-ci.org/display/HUDSON/Administering+Hudson
脚本:http://wiki.hudson-ci.org/display/HUDSON/Hudson+Script+Console
更多脚本示例:http://community.jboss.org/wiki/HudsonHowToDebug
答案 2 :(得分:0)
最终,这个问题是由两个问题引起的: 1)权限搞砸了。由于Hudson以前是以root身份启动的,因此操作所需的几个文件由root拥有。我无法找到一个很好的概要,其中哈德森相关的文件应该由哈德森拥有,哪个根本和猜测不起作用,所以在进行备份后,我重新安装了哈德森。
2)因为我一直使用带有点的“.hudson”的默认hudson主页,但尝试使用/ home / hudson(无点)的指定HUDSON_HOME重新启动,Hudson在/ home / hudson中创建了一个新家并且表现得像是一个全新的装置。我曾在某处看到HUDSON_HOME变量,并认为在我的启动脚本中将其指定为/ home / hudson会很好,从而无意中更改了Hudson使用的主页。一旦修复,它就会恢复正常。
答案 3 :(得分:0)
我从jdk 7升级到jdk 8并在同一服务器盒上安装了glassfish 4后遇到了同样的问题。我通过切换回以前的jdk来解决它:
sudo alternative --config java
有3个程序提供'java'。
输入以保留当前选择[+]或类型选择号:3