提问者:小点点

使用gfsh启动Gemfire:gfsh启动服务器中的ClassNotFind错误


我有以下环境: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>

我的包.监听器.测试监听器

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

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

spring-applation-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>

**我的包。加载器。我的测试缓存加载器:

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.从目录-C:\MyWorkspace\Pivotal_GemFire_800_b48398_Windows启动gfsh

开始定位器:开始定位器--name=locator1--port=10334

启动服务器:

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.SpringContextBootstrappingNovalizer

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

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。

有人能帮忙吗?


共3个答案

匿名用户

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

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

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

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

匿名用户

@suparno Karmakar-不确定您是否能够解决此问题,但在查看'start server'命令(即--classpath选项的值)的CLASSPATH时,假设路径是正确的,那么要记住的一件事是--classpath选项值在作为参数传递给'start server'时被读取到字符串中。

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

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

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

我相信Windows中的反斜杠也可以工作,因此…

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

@Randy May正确地指出,您可以使用'start server'命令的new'--spring-xml-place'选项来指示您想使用Spring Boot您的GemFire Server,当然假设您使用的是GemFire 8.1。

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

不幸的是,在使用'--spring-xml-place'选项和'start server'时发现了一个bug,因为Gfsh正在寻找错误版本的Spring JARS。它正在寻找Spring core 3.2.11。RELEASE而不是3.2.12。RELEASE,SDC 1.9.0。RELEASE而不是1.9.1。RELEASE和SDG1.5.1.BUILD-SNAPSHOT而不是1.5.1。RELEASE。

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

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

这是我的bug笔记…

错误标题:

当使用带有“启动服务器…--spring-xml-place”选项的Gfsh启动GemFire服务器时,GemFire Shell(Gfsh)在org/springframe/data/gemfire/support/SpringContextBootstrappingFirst alizer上抛出NoClassDefFoundError/ClassNotFoundException

错误解决方法:

错误解决方法:

希望这有帮助!如果您仍然有问题,请回复。

干杯!

匿名用户

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