diff --git a/bin/set-classpath.sh b/bin/set-classpath.sh
index abfe54e43..a3e051fb0 100644
--- a/bin/set-classpath.sh
+++ b/bin/set-classpath.sh
@@ -33,40 +33,22 @@ fi
# frontend tests. This uses jars to avoid issues related to that
# inconsistency.
CLASSPATH=\
-"$IMPALA_HOME"/fe/src/test/resources:\
-"$IMPALA_HOME"/fe/target/impala-frontend-${IMPALA_VERSION}.jar:\
-"$IMPALA_HOME"/fe/target/dependency:\
-"$IMPALA_HOME"/fe/target/impala-frontend-${IMPALA_VERSION}-tests.jar:
+"$IMPALA_HOME"/fe/src/test/resources:
-FE_CP_FILE="$IMPALA_HOME/fe/target/build-classpath.txt"
+PACKAGE_CP_FILE="$IMPALA_HOME/java/impala-package/target/package-classpath.txt"
-if [ ! -s "$FE_CP_FILE" ]; then
- >&2 echo FE classpath file $FE_CP_FILE missing.
- >&2 echo Build the front-end first.
+if [ ! -s "$PACKAGE_CP_FILE" ]; then
+ >&2 echo impala-package classpath file "$PACKAGE_CP_FILE" missing.
+ >&2 echo Build the impala-package first.
return 1
fi
-CLASSPATH=$(cat $FE_CP_FILE):"$CLASSPATH"
-
-# Currently the Calcite planner is experimental and not included by default.
-# If the USE_CALCITE_PLANNER is explicitly set, then the jar dependencies
-# are added to the CLASSPATH
-USE_CALCITE_PLANNER=${USE_CALCITE_PLANNER:-false}
-if [ "true" = "$USE_CALCITE_PLANNER" ]; then
-
- CALCITE_CP_FILE="$IMPALA_HOME/java/calcite-planner/target/calcite-build-classpath.txt"
- if [ ! -s "$CALCITE_CP_FILE" ]; then
- >&2 echo Calcite front-end classpath file $CALCITE_CP_FILE missing.
- >&2 echo Build the Calcite front-end first.
- return 1
- fi
- CLASSPATH="$CLASSPATH":$(cat $CALCITE_CP_FILE):\
-"$IMPALA_HOME"/java/calcite-planner/target/calcite-planner-${IMPALA_VERSION}.jar:
-fi
+CLASSPATH=$(cat "$PACKAGE_CP_FILE"):"$CLASSPATH"
if [[ "${1:-notest}" = "test" ]]; then
FE_TEST_CP_FILE="$IMPALA_HOME/fe/target/test-classpath.txt"
- CLASSPATH=$(cat $FE_TEST_CP_FILE):"$CLASSPATH"
+ CLASSPATH=$(cat "$FE_TEST_CP_FILE"):\
+"$IMPALA_HOME"/fe/target/impala-frontend-${IMPALA_VERSION}-tests.jar:"$CLASSPATH"
fi
: ${CUSTOM_CLASSPATH=}
diff --git a/docker/setup_build_context.py b/docker/setup_build_context.py
index 1761452cc..0dd6714cc 100755
--- a/docker/setup_build_context.py
+++ b/docker/setup_build_context.py
@@ -193,26 +193,28 @@ if args.utility_context:
os.path.join(IMPALA_HOME, "docker/utility_entrypoint.sh"), BIN_DIR)
else:
# Impala Coordinator dependencies.
+ impala_package_classpath_file = "java/impala-package/target/package-classpath.txt"
num_jars_on_classpath = 0
- dep_classpath = open(os.path.join(IMPALA_HOME, "fe/target/build-classpath.txt")).read()
+ num_frontend_jars = 0
+ num_calcite_jars = 0
+ dep_classpath = open(os.path.join(IMPALA_HOME, impala_package_classpath_file)).read()
for jar in dep_classpath.split(":"):
num_jars_on_classpath += 1
assert os.path.exists(jar), "missing jar from classpath: {0}".format(jar)
+ if jar.find("calcite-planner") != -1:
+ assert jar.find("tests") == -1
+ num_calcite_jars += 1
+ if jar.find("impala-frontend") != -1:
+ assert jar.find("tests") == -1
+ num_frontend_jars += 1
symlink_file_into_dir(jar, LIB_DIR)
if num_jars_on_classpath == 0:
raise Exception("No jars listed in {0}".format(os.path.join(IMPALA_HOME,
- "fe/target/build-classpath.txt")))
+ impala_package_classpath_file)))
- # Impala Coordinator jars.
- num_frontend_jars = 0
- for jar in glob.glob(os.path.join(IMPALA_HOME, "fe/target/impala-frontend-*.jar")):
- # Ignore the tests jar
- if jar.find("-tests") != -1:
- continue
- symlink_file_into_dir(jar, LIB_DIR)
- num_frontend_jars += 1
- # There must be exactly one impala-frontend jar.
+ # There must be exactly one jar for each of impala-frontend and calcite-planner
+ assert num_calcite_jars == 1
assert num_frontend_jars == 1
# Impala Executor dependencies.
diff --git a/java/impala-package/pom.xml b/java/impala-package/pom.xml
new file mode 100644
index 000000000..e256340e4
--- /dev/null
+++ b/java/impala-package/pom.xml
@@ -0,0 +1,79 @@
+
+
+
+
+ org.apache.impala
+ impala-parent
+ 5.0.0-SNAPSHOT
+
+ 4.0.0
+
+ impala-package
+ pom
+ Apache Impala Package
+
+
+
+ org.apache.impala
+ impala-frontend
+ ${project.version}
+
+
+ org.apache.impala
+ calcite-planner
+ ${project.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+
+
+ copy-dependencies
+ package
+
+ copy-dependencies
+
+
+ pom
+ runtime
+ true
+
+
+
+ write-classpath
+
+ build-classpath
+
+
+ ${project.build.directory}/package-classpath.txt
+ runtime
+ pom
+
+
+
+
+
+
+
diff --git a/java/pom.xml b/java/pom.xml
index 1a837e69b..4eed32513 100644
--- a/java/pom.xml
+++ b/java/pom.xml
@@ -579,6 +579,7 @@ under the License.
../fe
external-frontend
calcite-planner
+ impala-package
query-event-hook-api
shaded-deps/hive-exec
shaded-deps/s3a-aws-sdk
diff --git a/package/CMakeLists.txt b/package/CMakeLists.txt
index d264718ee..8e4c4273f 100644
--- a/package/CMakeLists.txt
+++ b/package/CMakeLists.txt
@@ -25,9 +25,7 @@ message(STATUS "DISTRIB_VERSION_ID: ${OS_DISTRIB_VERSION_ID}")
install(FILES ${CMAKE_SOURCE_DIR}/LICENSE.txt DESTINATION ${IMPALA_INSTALLDIR} RENAME LICENSE)
install(FILES ${CMAKE_SOURCE_DIR}/NOTICE.txt DESTINATION ${IMPALA_INSTALLDIR} RENAME NOTICE)
install(DIRECTORY "${CMAKE_SOURCE_DIR}/www/" DESTINATION ${IMPALA_INSTALLDIR}/www)
-install(FILES ${CMAKE_SOURCE_DIR}/fe/target/impala-frontend-$ENV{IMPALA_VERSION}.jar
- DESTINATION ${IMPALA_INSTALLDIR}/lib/jars)
-install(DIRECTORY ${CMAKE_SOURCE_DIR}/fe/target/dependency/
+install(DIRECTORY ${CMAKE_SOURCE_DIR}/java/impala-package/target/dependency/
DESTINATION ${IMPALA_INSTALLDIR}/lib/jars
FILES_MATCHING PATTERN "*.jar")
diff --git a/tests/custom_cluster/test_query_event_hooks.py b/tests/custom_cluster/test_query_event_hooks.py
index 84ca8852a..dc45a1cbf 100644
--- a/tests/custom_cluster/test_query_event_hooks.py
+++ b/tests/custom_cluster/test_query_event_hooks.py
@@ -18,17 +18,31 @@
# Client tests for Query Event Hooks
from __future__ import absolute_import, division, print_function
+import os
import pytest
from tests.common.custom_cluster_test_suite import CustomClusterTestSuite
+def add_frontend_test_jar_to_classpath():
+ """Put the impala-frontend-*-tests.jar on the classpath"""
+ os.environ["CUSTOM_CLASSPATH"] = os.path.join(os.getenv("IMPALA_HOME"), "fe",
+ "target", "impala-frontend-{0}-tests.jar".format(os.getenv("IMPALA_VERSION")))
+
+
class TestHooks(CustomClusterTestSuite):
"""
Tests for FE QueryEventHook invocations.
"""
DUMMY_HOOK = "org.apache.impala.testutil.DummyQueryEventHook"
+ @classmethod
+ def setup_class(cls):
+ super(TestHooks, cls).setup_class()
+ # This needs the impala-frontend-*-tests.jar on the classpath to make the test query
+ # hooks available.
+ add_frontend_test_jar_to_classpath()
+
@pytest.mark.execute_serially
@CustomClusterTestSuite.with_args(
impala_log_dir="{query_event_hooks_log}",
@@ -65,6 +79,9 @@ class TestHooksStartupFail(CustomClusterTestSuite):
if cls.exploration_strategy() != 'exhaustive':
pytest.skip('runs only in exhaustive')
super(TestHooksStartupFail, cls).setup_class()
+ # This needs the impala-frontend-*-tests.jar on the classpath to make the test query
+ # hooks available.
+ add_frontend_test_jar_to_classpath()
FAILING_HOOK = "org.apache.impala.testutil.AlwaysErrorQueryEventHook"
NONEXIST_HOOK = "captain.hook"