0

我们有一个 Nexus 服务器,它在星期五之前运行良好。Nexus 已停止,因为我们无法再次启动它,但我不知道为什么?

我认为这是一个码头问题。这是堆栈跟踪:

jvm 1    | 2012-08-13 09:31:10 WARN  [er_start_runner] - org.mortbay.log - failed SelectChannelConnector@*:8080
jvm 1    | java.net.SocketException: Unresolved address
jvm 1    |  at sun.nio.ch.Net.translateToSocketException(Net.java:58)
jvm 1    |  at sun.nio.ch.Net.translateException(Net.java:84)
jvm 1    |  at sun.nio.ch.Net.translateException(Net.java:90)
jvm 1    |  at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:61)
jvm 1    |  at org.mortbay.jetty.nio.SelectChannelConnector.open(SelectChannelConnector.java:216)

配置是(jetty.xml):

<Configure id="Server" class="org.mortbay.jetty.Server">
    <Call name="addConnector">
        <Arg>
            <New class="org.mortbay.jetty.nio.SelectChannelConnector">
              <Set name="host">${application-host}</Set>
              <Set name="port">${application-port}</Set>
            </New>
        </Arg>
    </Call>

    <Set name="handler">
      <New id="Contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection">
          <!-- The following configuration is REQUIRED, and MUST BE FIRST. 
               It makes the Plexus container available for use in the Nexus webapp. -->
          <Call name="addLifeCycleListener">
              <Arg>
                <New class="org.sonatype.plexus.jetty.custom.InjectExistingPlexusListener" />
              </Arg>
          </Call>

          <!-- The following configuration disables JSP taglib support, the validation of which
               slows down Jetty's startup significantly. -->
          <Call name="addLifeCycleListener">
              <Arg>
                <New class="org.sonatype.plexus.jetty.custom.DisableTagLibsListener" />
              </Arg>
          </Call>
      </New>
    </Set>

    <New id="NexusWebAppContext" class="org.mortbay.jetty.webapp.WebAppContext">
      <Arg><Ref id="Contexts"/></Arg>
      <Arg>${webapp}</Arg>
      <Arg>${webapp-context-path}</Arg>
      <Set name="extractWAR">false</Set>
    </New>

    <Set name="stopAtShutdown">true</Set>
    <Set name="sendServerVersion">true</Set>
    <Set name="sendDateHeader">true</Set>
    <Set name="gracefulShutdown">1000</Set>
</Configure>

和 plexus.properties:

application-port=8081
application-host=0.0.0.0
runtime=${basedir}/runtime
apps=${runtime}/apps
nexus-work=${basedir}/../../data/nexus/sonatype-work/nexus
nexus-app=${runtime}/apps/nexus
webapp=${runtime}/apps/nexus/webapp
webapp-context-path=/nexus
security-xml-file=${nexus-work}/conf/security.xml
application-conf=${nexus-work}/conf
runtime-tmp=${runtime}/tmp

# If this file is present, it will be used to configure Jetty.
jetty.xml=${basedir}/conf/jetty.xml

# Uncomment this to use the debug js files
#index.template.file=templates/index-debug.vm

Nexus 版本是 1.9.2.3

我不明白:为什么它要在端口 8080 启动连接器(而我只设置端口 8081)以及地址 * 是什么意思(为什么不是 0.0.0.0)?当然,为什么它不想再开始了?

非常感谢您的所有想法!

4

3 回答 3

2

我无法评论 8080 与 8081 的问题,但至于 SocketException ...

SocketException: unresolved address 通常是由于系统上存在某种 host/dns/resolve 配置问题。

可能有助于识别问题的 java 最基本的测试用例如下

import java.net.InetAddress;
import java.net.InetSocketAddress;

public class AddrTest
{
    public static void main(String[] args)
    {
        try
        {
            InetAddress addr = InetAddress.getByName("0.0.0.0");
            System.out.println("InetAddress => " + addr);
            System.out.println("InetAddress.isAnyLocalAddress = " + addr.isAnyLocalAddress());
            System.out.println("InetAddress.isLinkLocalAddress = " + addr.isLinkLocalAddress());
            System.out.println("InetAddress.isLoopbackAddress = " + addr.isLoopbackAddress());

            InetSocketAddress isockaddr = new InetSocketAddress(addr,8080);
            System.out.println("InetSocketAddr = " + isockaddr);
            System.out.println("InetSocketAddr.isUnresolved = " + isockaddr.isUnresolved());
        }
        catch (Throwable e)
        {
            e.printStackTrace();
        }
    }
}

运行这个,你应该有输出

InetAddress => /0.0.0.0
InetAddress.isAnyLocalAddress = true
InetAddress.isLinkLocalAddress = false
InetAddress.isLoopbackAddress = false
InetSocketAddr = /0.0.0.0:8080
InetSocketAddr.isUnresolved = false

需要注意的是2行......

  • InetAddress.isAnyLocalAddress = true- 表示 java + OS 将此报告为 ANY addr
  • InetSocketAddr.isUnresolved = false- 意味着 java + OS 能够解析这个套接字地址

如果您在此测试期间遇到异常,那么您的系统上存在某种基本的主机解析问题(dns、dhcp.vpn、etc/hosts、没有可用的 IPv4 等),您在 java、jetty 中没有做任何事情, 或 nexus 可以解决此类问题。您需要在操作系统/网络级别解决这个问题(不是双关语)。

于 2012-08-13T13:39:01.453 回答
0

我有一个类似的问题。码头在码头集装箱(码头:9.3.24-jre8)内运行。您需要在 start.ini 中注释掉有关 http.host 的行:

#jetty.http.host='0.0.0.0'

由于某种原因,网络接口混淆了。

于 2018-09-19T15:53:05.827 回答
-1

解决了!

文件 jetty.xml 只有 'r' 权限是不够的:它还必须有 'x' 权限。所以 Jetty 无法读取文件 jetty.xml ,在这种情况下,它会尝试在 '*:8080' => * 上启动默认连接器,这是不可解析的(我不知道他们为什么使用 * 而不是 0.0.0.0 ? ??)

所以这是一个配置问题。

于 2012-08-14T07:29:11.157 回答