在gfsh启动服务器中使用gfsh启动Gemfire:ClassNotFound错误

时间:2015-05-14 20:34:52

标签: java bootstrapping gemfire

我有以下环境:操作系统--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;

我的简单项目文件: 缓存XML的文件: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. 启动服务器:

  3. 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依赖/ classpath。

    1. 如果我尝试在gfsh start server命令的classpath中提供多个jar:
    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\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 个答案:

答案 0 :(得分:1)

我认为问题只是你有':'作为类路径中的分隔符。 Windows想要';'这里。在这种情况下,您无需设置CLASSPATH环境变量。

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

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

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

答案 1 :(得分:0)

@Suparno Karmakar - 不确定您是否能够解决此问题,但在审核您的CLASSPATH以启动服务器&#39;命令(即--classpath选项的值),假设路径是正确的,那么要记住的一点是--classpath选项值在作为参数传递给&#39; start时读入String服务器&#39;

从那里,随后传递CLASSPATH值并将其附加到用于&#34; fork&#34;的最终命令行String(java.exe -classpath ... JVM arg)。 GemFire服务器的JVM进程(使用java.lang.ProcessBuilder API)。

Java最有可能将路径信息中的第一个正斜杠()视为&#34;转义&#34; character&#34;,所以你必须像......一样逃避转义字符。

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

我相信Windows中的反斜杠也会起作用,因此......

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

@Randy May说明你可以使用&#39;启动服务器&#39;命令的新&#39; - spring-xml-location&#39;假设你当然正在使用GemFire 8.1,那么表明你想用Spring引导你的GemFire服务器的选项。

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

不幸的是,使用&#39; - spring-xml-location&#39;时发现了一个错误。选项&#39;启动服务器&#39;因为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。 / p>

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

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

以下是我的错误提示......

错误标题:

  

GemFire Shell(Gfsh)抛出一个   NoClassDefFoundError / ClassNotFoundException on   组织/ springframework的/数据/的GemFire /支持/ SpringContextBootstrappingInitializer   使用Gfsh启动GemFire服务器时使用&#39;启动服务器...   --spring-XML的位置&#39; GemFire 8.1中的选项

错误解决方法:

  

当用户尝试使用Gfsh启动GemFire服务器时   &#39;启动服务器&#39;通过指定使用Spring引导的命令   &#39; - 弹簧XML的位置&#39;选项,GemFire 8.1(Gfsh)抛出一个   由ClassNotFoundException引起的NoClassDefFoundError ... {{{The   高速缓存服务器进程意外终止,退出状态为1。   请参阅/ Users / jblum / vmdev / lab / serverX中的日志文件   全部细节。线程&#34; main&#34;中的例外情况   java.lang.NoClassDefFoundError:   组织/ springframework的/数据/的GemFire /支持/ 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)at   java.net.URLClassLoader $ 1.run(URLClassLoader.java:355)at   java.security.AccessController.doPrivileged(Native Method)at   java.net.URLClassLoader.findClass(URLClassLoader.java:354)at   java.lang.ClassLoader.loadClass(ClassLoader.java:425)at   sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:308)at at   java.lang.ClassLoader.loadClass(ClassLoader.java:358)... 4 more}}}   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随附   弹簧数据公地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目录/弹簧数据的GemFire,1.5.1.RELEASE.jar   $ GEMFIRE / lib / spring-data-gemfire-1.5.1.BUILD-SNAPSHOT.jar ---注意:   不幸的是,错误是Gfsh正在寻找错误的版本   这些特殊的Spring JAR文件。 --- 2.另一种选择,是   使用自己手动指定Spring JARS和版本   &#39; - 类路径&#39;启动服务器的选项&#39;命令。请注意,在GemFire中   8.1,&#39; - classpath&#39;选项已更改为&#34; prepend&#34;选项,因此,有效地覆盖了任何GemFire lib依赖项   $ GEMFIRE / lib目录。小心,但是应该小心   覆盖任何GemFire lib依赖项。注意,这&#34; prepend&#34;   行为不适用于&#39; gemfire.jar&#39;归档为安全   的原因。

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

干杯!

答案 2 :(得分:0)

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