1

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

有人可以帮忙吗?

4

3 回答 3

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 上下文文件中定义所有内容。

于 2015-05-15T02:46:45.960 回答
0

@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) 在使用 Gfsh 启动 GemFire 服务器时在 org/springframework/data/gemfire/support/SpringContextBootstrappingInitializer 上抛出 NoClassDefFoundError/ClassNotFoundException,在 GemFire 8.1 中使用 'start server ... --spring-xml-location' 选项

错误解决方法:

当用户尝试使用 Gfsh 启动 GemFire 服务器时,通过指定“--spring-xml-location”选项使用 Spring 引导的“启动服务器”命令,GemFire 8.1 (Gfsh) 抛出由 ClassNotFoundException 引起的 NoClassDefFoundError ... {{{ 缓存服务器进程意外终止,退出状态为 1。有关完整详细信息,请参阅 /Users/jblum/vmdev/lab/serverX 中的日志文件。线程“main”中的异常 java.lang.NoClassDefFoundError: org/springframework/data/gemfire/support/SpringContextBootstrappingInitializer at com.gemstone.gemfire.distributed.ServerLauncher.startWithSpring(ServerLauncher.java:764) at 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-1.5.1.RELEASE.jar 正确指定了 Spring Data GemFire JAR 文件,请参阅 Bugnote workaround 以解决此问题。

错误解决方法:

有两种方法可以解决这个问题: 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' 选项到 'start server' 命令。笔记,在 GemFire 8.1 中,“--classpath”选项已更改为“前置”选项,因此,有效地覆盖了 $GEMFIRE/lib 目录中的任何 GemFire lib 依赖项。小心,但是在覆盖任何 GemFire 库依赖项时应小心。注意,出于安全原因,这种“前置”行为不适用于“gemfire.jar”文件本身。

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

干杯!

于 2015-06-11T19:28:20.503 回答
0

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

于 2019-11-20T03:07:52.970 回答