【问题标题】:Gemfire startup with gfsh: ClassNotFound error in gfsh start server使用 gfsh 启动 Gemfire:gfsh 启动服务器中的 ClassNotFound 错误
【发布时间】:2015-05-14 20:34:51
【问题描述】:

我有以下环境:OS - Windows7

环境变量集:

CLASSPATH = C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\gemfire.jar;C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\antlr.jar;C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\gfsh-dependencies.jar;C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\gfSecurityImpl.jar;C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\jackson-core-2.2.0.jar;C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\commons-logging-1.1.1.jar;C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\tomcat-embed-core.jar;C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\tomcat-embed-jasper.jar;C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows\lib\tomcat-embed-logging-juli.jar;%JAVA_HOME%\lib\tools.jar;C:\MyWorkspace\Repository\org\springframework\data\spring-data-gemfire\1.5.1.RELEASE\spring-data-gemfire-1.5.1.RELEASE.jar;%CLASSPATH%
GEMFIRE = C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows GF_JAVA = %JAVA_HOME%\bin\java.exe JAVA_HOME = C:\MyWorkspace\JDK8\jdk1.8.0_31 MAVEN_HOME = C:\MyWorkspace\Maven\apache-maven-3.3.1 PATH = %JAVA_HOME%\bin;%ERACOM_HOME%;%Cryptoki%;%WAS_HOME%\bin;%MAVEN_HOME%\bin;C:\Windows\System32;C:\Windows;C:\OtherProgramFiles\nodejs\;%GEMFIRE%\bin;

我的简单项目文件: cache-xml-file:cache.xml

<cache>
    <region name="Apps">
        <region-attributes>
            <cache-listener>
                <class-name>mypackage.listener.TestListener</class-name>
            </cache-listener>
        </region-attributes>
    </region>
    <initializer>
        <class-name>org.springframework.data.gemfire.support.SpringContextBootstrappingInitializer</class-name>
        <parameter name="contextConfigLocations">
            <string>spring-application-context.xml</string>
            </parameter>
    </initializer>
</cache>

mypackage.listener.TestListener

public class TestListener implements CacheListener, Declarable {
  @
  Override
  public void init(Properties arg0) {
    System.out.println("Inside TestListener.init()");
  }

  ... //Other Overridden methods . . .
}

spring-application-context.xml:包含单个 bean:

<?xml version="1.0" encoding="utf-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:gfe="http://www.springframework.org/schema/gemfire" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
          http://www.springframework.org/schema/gemfire http://www.springframework.org/schema/gemfire/spring-gemfire.xsd
          http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

  <bean id="myTestCacheLoader" class="mypackage.loader.MyTestCacheLoader">
  </bean>

</beans>

**mypackage.loader.MyTestCacheLoader:

public class MyTestCacheLoader implements
CacheLoader, Declarable {

  @
  Override
  public void close() {

  }

  @
  Override
  public Object load(LoaderHelper arg0) throws CacheLoaderException {
    System.out.println("Inside MyTestCacheLoader.load()");
    return null;
  }

  @
  Override
  public void init(Properties arg0) {

  }

}

步骤: 1.从目录启动gfsh - C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows

  1. 启动定位器:启动定位器 --name=locator1 --port=10334

  2. 启动服务器:

start server --name=server1 --server-port=40411 --cache-xml-file=C:\MyWorkspace\Codebase\ContentServices\content-loaderwriter\src\test\resources\cache-loader-writer.xml --classpath=C:\MyWorkspace\Codebase\ContentServices\content-loaderwriter\target\content-loaderwriter-0.0.1-SNAPSHOT.jar

但是它的抛出:java.lang.ClassNotFoundException: org.springframework.data.gemfire.support.SpringContextBootstrappingInitializer

我什至在 CLASSPATH 变量中添加了 gemfire jar 以及上面的 spring-data-gemfire jar(来自我的 repo)。仍然得到异常。似乎没有解决 maven 依赖项/类路径。

  1. 如果我尝试在 gfsh start server 命令的类路径中提供多个 jar:
start server --name=server1 --server-port=40411 --cache-xml-file="C:\MyWorkspace\Codebase\ContentServices\content-loaderwriter\src\test\resources\cache-loader-writer.xml" --classpath="C:\MyWorkspace\Repository\org\springframework\data\spring-data-gemfire\1.5.1.RELEASE\spring-data-gemfire-1.5.1.RELEASE.jar:C:\MyWorkspace\Codebase\ContentServices\content-loaderwriter\target\content-loaderwriter-0.0.1-SNAPSHOT.jar"

我仍然得到 ClassNotFoundException。它没有解析类路径中提供的 jar。

有人可以帮忙吗?

【问题讨论】:

    标签: java bootstrapping gemfire


    【解决方案1】:

    我认为问题在于您在类路径中使用 ':' 作为分隔符。 Windows 想要一个 ';'这里。在这种情况下,您不需要设置 CLASSPATH 环境变量。

    但是,您很可能需要 spring-data-gemfire 所依赖的其他 jar。看起来您正在使用 maven,所以这里是获取所有项目依赖项(包括传递依赖项)的类路径的简单方法。

    在您的项目目录中,运行“mvn -DexcludeArtifactIds=gemfire dependency:build-classpath”。这将为您提供除 gemfire 之外的所有依赖项(自动提供)。将您的应用程序 jar 添加到生成的类路径中,您应该拥有所需的一切。

    另外,根据您所做的,您可能会对 8.1 中添加到“gfsh start”命令的“--spring-xml-location”选项感兴趣。这允许您完全省去“cache.xml”,并使用 spring-data-gemfire 提供的“gfe”命名空间在 spring 上下文文件中定义所有内容。

    【讨论】:

    • 我试过用';'以及 ',' - 它们都不起作用
    • 可能是引号。它们不是必需的。您可以删除它们并使用';'重试吗对于分隔符?
    • 感谢您的回复。我也尝试过删除引号..但它没有用。
    【解决方案2】:

    @Suparno Karmakar - 不确定您是否能够解决此问题,但在查看“启动服务器”命令(即 --classpath 选项的值)的 CLASSPATH 时,假设路径正确,那么要记住的一件事是 --classpath 选项值在作为参数传递给“启动服务器”时被读入字符串。

    从那里,CLASSPATH 值随后被传递并附加到最​​终的命令行字符串 (java.exe -classpath ... JVM arg),该字符串用于为 GemFire 服务器“分叉”JVM 进程(使用java.lang.ProcessBuilder API)。

    Java 很可能将路径信息中的第一个正斜杠 () 视为“转义”字符”,因此您必须将转义字符转义为...

    C:\\path\\to\\external\\file.jar
    

    我相信 Windows 中的反斜杠也可以使用,因此...

    C:/path/to/external/file.jar
    

    @Randy May 正确地指出你可以使用“启动服务器”命令的新“--spring-xml-location”选项来表明你想用 Spring 引导你的 GemFire 服务器,假设你当然是使用 GemFire 8.1。

    通过使用此选项,来自 $GEMFIRE/lib 的相应 Spring JARS 会在启动时自动附加到服务器的 CLASSPATH(否则不使用)。

    不幸的是,在使用带有“启动服务器”的“--spring-xml-location”选项时发现了一个错误,即 Gfsh 正在寻找错误版本的 Spring JARS。它正在寻找 Spring 核心 3.2.11.RELEASE 而不是 3.2.12.RELEASE、SDC 1.9.0.RELEASE 而不是 1.9.1.RELEASE 和 SDG 1.5.1.BUILD-SNAPSHOT 而不是 1.5.1.RELEASE。

    只需重命名 $GEMFIRE/lib 中的 Spring JAR 即可解决此问题。

    请参阅https://svn.gemstone.com/trac/gemfire/ticket/51956,尽管在 GemFire 8.2 的发行说明发布之前(~7 月),您可能无法查看此错误。

    这是我的错误说明...

    错误标题:

    GemFire Shell (Gfsh) 抛出一个 NoClassDefFoundError/ClassNotFoundException on org/springframework/data/gemfire/support/SpringContextBootstrappingInitializer 当使用 Gfsh 和 'start server ... 启动 GemFire 服务器时 GemFire 8.1 中的 --spring-xml-location' 选项

    错误解决方法:

    当用户尝试使用 Gfsh 启动 GemFire 服务器时, 通过指定使用 Spring 引导的“启动服务器”命令 '--spring-xml-location' 选项,GemFire 8.1 (Gfsh) 抛出一个 由 ClassNotFoundException 引起的 NoClassDefFoundError... {{{ The 缓存服务器进程意外终止,退出状态为 1。 请参考 /Users/jblum/vmdev/lab/serverX 中的日志文件 完整的细节。线程“主”中的异常 java.lang.NoClassDefFoundError: org/springframework/data/gemfire/support/SpringContextBootstrappingInitializer 在 com.gemstone.gemfire.distributed.ServerLauncher.startWithSpring(ServerLauncher.java:764) 在 com.gemstone.gemfire.distributed.ServerLauncher.start(ServerLauncher.java:696) 在 com.gemstone.gemfire.distributed.ServerLauncher.run(ServerLauncher.java:626) 在 com.gemstone.gemfire.distributed.ServerLauncher.main(ServerLauncher.java:200) 引起:java.lang.ClassNotFoundException: org.springframework.data.gemfire.support.SpringContextBootstrappingInitializer 在 java.net.URLClassLoader$1.run(URLClassLoader.java:366) 在 java.net.URLClassLoader$1.run(URLClassLoader.java:355) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:354) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:425) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 4 更多 }}} GemFire 错误地将 Spring LIBS 指定为版本 3.2.11.RELEASE 当 GemFire 实际上附带 Spring 3.2.12.RELEASE JAR 文件时。此外,Spring Data Commons JAR 文件是 错误识别为 spring-data-commons-1.9.0.RELEASE.jar, 但是,GemFire 8.1 附带 spring-data-commons-1.9.1.RELEASE.jar。请注意,8.1 中的 GemFire/Gfsh 正确指定 Spring Data GemFire JAR 文件 spring-data-gemfire-1.5.1.RELEASE.jar 请参阅 Bugnote 解决方法 解决这个问题。

    错误解决方法:

    有两种方法可以解决此问题: 1. 首先,经过尝试和尝试 测试程序是... 1.1 下载并复制Spring 3.2.11.RELEASE JAR 文件到 $GEMFIRE/lib 目录。对于 $GEMFIRE/lib 中的每个 Spring 3.2.12.RELEASE JAR 文件,复制相应的 3.2.11.RELEASE JAR 到 $GEMFIRE/lib。 1.2 接下来,下载 spring-data-commons-1.9.0.RELEASE.jar 文件并将其复制到 $GEMFIRE/lib 中。 1.3 最后,执行以下... $ cp $GEMFIRE/lib/spring-data-gemfire-1.5.1.RELEASE.jar $GEMFIRE/lib/spring-data-gemfire-1.5.1.BUILD-SNAPSHOT.jar --- 注意: 不幸的是,错误是 Gfsh 正在寻找错误的版本 这些特定的 Spring JAR 文件。 --- 2. 另一种选择是 使用手动指定 Spring JARS 和版本 “启动服务器”命令的“--classpath”选项。注意,在 GemFire 在 8.1 中,“--classpath”选项已更改为“前置”选项,因此,有效地覆盖了 $GEMFIRE/lib 目录。小心,但应注意当 覆盖任何 GemFire 库依赖项。注意,这个“前置” 出于安全考虑,该行为不适用于“gemfire.jar”文件本身 原因。

    希望这会有所帮助!如果您仍有问题,请回帖。

    干杯!

    【讨论】:

      【解决方案3】:

      请将分隔符“:”替换为“\;” 您需要在 windows 分隔符之前添加转义字符。否则,gfsh 将处理“;”作为一个命令的结尾。

      【讨论】:

        猜你喜欢
        • 2014-07-01
        • 2019-02-26
        • 2017-06-14
        • 2012-03-05
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        相关资源
        最近更新 更多