Jens Deppe created GEODE-1331:
---------------------------------
Summary: gfsh.bat on Windows is incorrect
Key: GEODE-1331
URL: https://issues.apache.org/jira/browse/GEODE-1331
Project: Geode
Issue Type: Bug
Reporter: Jens Deppe
Initial report:
{quote}
I am doing testing in windows STS. I am not adding these dependencies jars,
gfsh.bat is what doing this.
C:\DEV\Pivotal\GemFire_v82014\bin\gfsh.bat has below code, which is setting
gemfire, antlr, gfsh-dependencies and pulse-dependencies jars in classpath.
Line 26 to 29
@set
GEMFIRE_JARS=%GEMFIRE%\lib\gemfire.jar;%GEMFIRE%\lib\antlr.jar;%GEMFIRE%\lib\gfsh-dependencies.jar;%GEMFIRE%\lib\pulse-dependencies.jar
@if defined CLASSPATH (
@set GEMFIRE_JARS=%GEMFIRE_JARS%;%CLASSPATH%
)
C:\DEV\Pivotal\GemFire_v82014\lib\gemfire.jar // DUPLICATE
C:\DEV\Pivotal\GemFire_v82014\lib\antlr.jar
C:\DEV\Pivotal\GemFire_v82014\lib\gfsh-dependencies.jar // DUPLICATE
C:\DEV\Pivotal\GemFire_v82014\lib\pulse-dependencies.jar
Unix C:\DEV\Pivotal\GemFire_v82014\bin script, does not set these jars in
classpath.
Another observation is that, if I pass --include-system-classpath to gfsh start
server command, then it is prepending gemfire.jar and gfsh-dependencies.jar to
the system classpath and adding that to the server, that is what is shown in
logs
Class Path:
C:\DEV\Pivotal\GemFire_v82014\lib\gemfire.jar
C:\DEV\Pivotal\GemFire_v82014\lib\gfsh-dependencies.jar
…………
………..
C:\Program Files\Java\jdk1.7.0_67\lib\tools.jar
C:\DEV\Pivotal\GemFire_v82014\lib\server-dependencies.jar
start server \
--name=${NAME} --server-port=${PORT} \
--properties-file=${GEMFIRE_PWD}/resources/cache.properties \
--J=-Dgemfire.distributed-system-id=${DISTRIBUTED_SYSTEM_ID} \
--J=-Dgemfire.bind-address=${HOST_NAME}
--J=-Dgemfire.server-bind-address=${HOST_NAME} \
--J=-Dgemfire.locators=${HOST_NAME}[${LOCATOR_PORT}] \
--J=-Dgemfire.OSProcess.ENABLE_OUTPUT_REDIRECTION=true \
--include-system-classpath
If I don’t pass this parameter, then it does not add gfsh-dependencies
Class Path:
C:\DEV\Pivotal\GemFire_v82014\lib\gemfire.jar
C:\DEV\Pivotal\GemFire_v82014\lib\server-dependencies.jar
I am trying to do testing without using –include-system-classpath instead add
jars in to the start server –classpath as a work around.
{quote}
And a subsequent reply from John Blum:
{quote}
My apologies. I was not aware that you were launching your GemFire process
(e.g. Server) using Gfsh, and specifically with gfsh.bat on Windows.
I just confirmed the line(s) you were looking at in gfsh.bat, and indeed the
BAT file is wrong! Specifically, the classpath for the GemFire process is
being constructed from the following lines...
@set
GEMFIRE_JARS=%GEMFIRE%\lib\gemfire.jar;%GEMFIRE%\lib\antlr.jar;%GEMFIRE%\lib\gfsh-dependencies.jar;%GEMFIRE%\lib\pulse-dependencies.jar
...
@set GFSH_JARS=;%GEMFIRE%\lib\gfsh-dependencies.jar
@set CLASSPATH=%GFSH_JARS%;%GEMFIRE_JARS%
The Windows BAT file is also inconsistent with the Bash shell version (gfsh),
which rightfully only contains...
GEMFIRE_JARS=$GEMFIRE/lib/gfsh-dependencies.jar
if [ "x$CLASSPATH" != "x" ]; then
GEMFIRE_JARS=$GEMFIRE_JARS:$CLASSPATH
fi
CLASSPATH=$GEMFIRE_JARS
In addition, the Bash shell version launches the Gfsh process using the java
-classpath option...
"$GF_JAVA" -Dgfsh=true
-Dlog4j.configurationFile=/com/gemstone/gemfire/internal/logging/log4j/log4j2-cli.xml
${JLINE_TERMINAL} -classpath "${CLASSPATH}" $JAVA_ARGS $LAUNCHER "$@"
Which does not "export", or rather, set the global System CLASSPATH environment
variable. Here it is only setting the Java System property to the Java
process, where as, I believe, the Window BAT file is actually setting the
System CLASSPATH environment variable, since there is no java -classpath option
present in the command to launch Gfsh...
@"%GF_JAVA%" -Dgfsh=true
-Dlog4j.configurationFile=/com/gemstone/gemfire/internal/logging/log4j/log4j2-cli.xml
%JAVA_ARGS% %LAUNCHER% %*
Regarding...
> I think we need Pivotal Engineering team to look into gfsh.bat and
> –include-system-classpath behavior.
Not exactly. --include-system-classpath basically functions such that it
appends the value of the System CLASSPATH environment variable to the forked
GemFire process launched from Gfsh if the user has set the global variable per
environment and wishes to use it.
In a nutshell, GemFire documentation use to erroneously recommend users to set
the System CLASSPATH environment variable. This is a serious JRE anti-pattern
that can adversely affect any and all running Java applications on the same
machine since all Java launcher invocations use the CLASSPATH environment
variable as part of the classpath on start, unlike the -classapth option, which
only pertains to that particular JVM instance invoked with the java launcher.
Therefore, -classpath should be preferred over setting the global, CLASSPATH
environment variable, which can lead to unintended consequences.
The --include-system-classpath was meant to restore the recommended behavior
and allow GemFire processes to use the global CLASSPATH environment variable in
their classpath, which just appends the value to the forked processes classpath
on start. I know, because I was also responsible for this, ;-)
See here \[1\] (notice the 'classpath' variable), then here \[2\], then here
\[3\], and then finally, here \[4\].
If you follow the logic closely, you will notice how it first adds the gemfire
JAR \[5\], then includes the user's classes \[6\] (as specified with the
--classpath option to start locator|server), next includes the global System
classpath \[7\] (as specified in the CLASSPATHenvironment variable), and
finally, includes any JAR files \[8\] (mainly from $GEMFIRE/lib, and
specifically/technically, only what was once the server-dependencies.jar \[9\]
file, now the geode-dependencies.jar in Apache Geode; NOTE: this is the Geode
codebase I am making references to).
Anyway, all of this is to say the --include-system-classpath is not going to
help and is not really what you want anyway. Essentially, you just want to
ensure that the application classes and JARs are on the classpath of the
GemFire process before the $GEMFIRE/lib/*-dependencies.jar files.
This is the problem your (local) test environment is currently having, which
was apparent in the classpath output of the server's log file on startup.
\[1\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1606-L1608
\[2\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1751-L1753
\[3\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1119-L1128
\[4\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1134-L1168
\[5\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1136
\[6\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1138-L1149
\[7\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1152-L1155
\[8\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1157-L1165
\[9\]
https://github.com/apache/incubator-geode/blob/rel/v1.0.0-incubating.M2/geode-core/src/main/java/com/gemstone/gemfire/management/internal/cli/commands/LauncherLifecycleCommands.java#L1124
{quote}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)