diff --git a/be/CMakeLists.txt b/be/CMakeLists.txt index 9dd71d40245fa80..fafaff15fe164ca 100644 --- a/be/CMakeLists.txt +++ b/be/CMakeLists.txt @@ -443,11 +443,25 @@ if ("${DORIS_JAVA_HOME}" STREQUAL "") set(DORIS_JAVA_HOME "$ENV{JAVA_HOME}") endif() -include_directories(${DORIS_JAVA_HOME}/include) -if (NOT OS_MACOSX) - include_directories(${DORIS_JAVA_HOME}/include/linux) +execute_process(COMMAND chmod 755 ${BASE_DIR}/../tools/find_libjvm.sh) +execute_process(COMMAND ${BASE_DIR}/../tools/find_libjvm.sh OUTPUT_VARIABLE LIBJVM_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) +FILE(GLOB_RECURSE LIB_JVM ${LIBJVM_PATH}) +if("${LIB_JVM}" STREQUAL "") + message(STATUS "there is no libjvm found!") else() - include_directories(${DORIS_JAVA_HOME}/include/darwin) + set(DORIS_DEPENDENCIES + ${DORIS_DEPENDENCIES} + jvm + ) + add_library(jvm SHARED IMPORTED) + set_target_properties(jvm PROPERTIES IMPORTED_LOCATION ${LIB_JVM}) + include_directories(${DORIS_JAVA_HOME}/include) + if (NOT OS_MACOSX) + include_directories(${DORIS_JAVA_HOME}/include/linux) + else() + include_directories(${DORIS_JAVA_HOME}/include/darwin) + endif() + add_definitions("-DLIBJVM") endif() if (NOT OS_MACOSX) diff --git a/be/src/util/CMakeLists.txt b/be/src/util/CMakeLists.txt index 8b99fcf015eb36e..de4d27eeebb708e 100644 --- a/be/src/util/CMakeLists.txt +++ b/be/src/util/CMakeLists.txt @@ -29,6 +29,8 @@ else () list(REMOVE_ITEM UTIL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/perf_counters_mac.cpp ${CMAKE_CURRENT_SOURCE_DIR}/disk_info_mac.cpp) endif() +list(REMOVE_ITEM UTIL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/libjvm_loader.cpp) + add_library(Util STATIC ${UTIL_FILES} ) diff --git a/be/src/util/jni-util.cpp b/be/src/util/jni-util.cpp index 428c587f6677115..25f4f913d8a4cb1 100644 --- a/be/src/util/jni-util.cpp +++ b/be/src/util/jni-util.cpp @@ -37,7 +37,7 @@ #include "gutil/strings/substitute.h" #include "util/doris_metrics.h" #include "util/jni_native_method.h" -#include "util/libjvm_loader.h" +// #include "util/libjvm_loader.h" using std::string; @@ -456,7 +456,7 @@ Status JniUtil::get_jni_scanner_class(JNIEnv* env, const char* classname, } Status JniUtil::Init() { - RETURN_IF_ERROR(LibJVMLoader::instance().load()); + // RETURN_IF_ERROR(LibJVMLoader::instance().load()); // Get the JNIEnv* corresponding to current thread. JNIEnv* env = nullptr; diff --git a/bin/check_be_version.sh b/bin/check_be_version.sh new file mode 100644 index 000000000000000..b44d0c8f6411cc0 --- /dev/null +++ b/bin/check_be_version.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -eo pipefail + +curdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)" + +if [[ "$(uname -s)" == 'Darwin' ]] && command -v brew &>/dev/null; then + PATH="$(brew --prefix)/opt/gnu-getopt/bin:${PATH}" + export PATH +fi + +DORIS_HOME="$( + cd "${curdir}/.." + pwd +)" +export DORIS_HOME + +jdk_version() { + local java_cmd="${1}" + local result + local IFS=$'\n' + + if [[ -z "${java_cmd}" ]]; then + result=no_java + return 1 + else + local version + # remove \r for Cygwin + version="$("${java_cmd}" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n' | grep version | awk '{print $3}')" + version="${version//\"/}" + if [[ "${version}" =~ ^1\. ]]; then + result="$(echo "${version}" | awk -F '.' '{print $2}')" + else + result="$(echo "${version}" | awk -F '.' '{print $1}')" + fi + fi + echo "${result}" + return 0 +} + +setup_java_env() { + local java_version + + if [[ -z "${JAVA_HOME}" ]]; then + return 1 + fi + + local jvm_arch='amd64' + if [[ "$(uname -m)" == 'aarch64' ]]; then + jvm_arch='aarch64' + fi + java_version="$( + set -e + jdk_version "${JAVA_HOME}/bin/java" + )" + if [[ "${java_version}" -gt 8 ]]; then + export LD_LIBRARY_PATH="${JAVA_HOME}/lib/server:${JAVA_HOME}/lib:${LD_LIBRARY_PATH}" + # JAVA_HOME is jdk + elif [[ -d "${JAVA_HOME}/jre" ]]; then + export LD_LIBRARY_PATH="${JAVA_HOME}/jre/lib/${jvm_arch}/server:${JAVA_HOME}/jre/lib/${jvm_arch}:${LD_LIBRARY_PATH}" + # JAVA_HOME is jre + else + export LD_LIBRARY_PATH="${JAVA_HOME}/lib/${jvm_arch}/server:${JAVA_HOME}/lib/${jvm_arch}:${LD_LIBRARY_PATH}" + fi +} + +# prepare jvm if needed +setup_java_env || true + +if [[ -e "${DORIS_HOME}/bin/palo_env.sh" ]]; then + # shellcheck disable=1091 + source "${DORIS_HOME}/bin/palo_env.sh" +fi + +chmod 755 "${DORIS_HOME}/lib/doris_be" + +"${DORIS_HOME}"/lib/doris_be --version diff --git a/bin/start_be.sh b/bin/start_be.sh index 361f37552e871d0..82170a986a34e45 100755 --- a/bin/start_be.sh +++ b/bin/start_be.sh @@ -170,6 +170,35 @@ jdk_version() { return 0 } +setup_java_env() { + local java_version + + if [[ -z "${JAVA_HOME}" ]]; then + return 1 + fi + + local jvm_arch='amd64' + if [[ "$(uname -m)" == 'aarch64' ]]; then + jvm_arch='aarch64' + fi + java_version="$( + set -e + jdk_version "${JAVA_HOME}/bin/java" + )" + if [[ "${java_version}" -gt 8 ]]; then + export LD_LIBRARY_PATH="${JAVA_HOME}/lib/server:${JAVA_HOME}/lib:${LD_LIBRARY_PATH}" + # JAVA_HOME is jdk + elif [[ -d "${JAVA_HOME}/jre" ]]; then + export LD_LIBRARY_PATH="${JAVA_HOME}/jre/lib/${jvm_arch}/server:${JAVA_HOME}/jre/lib/${jvm_arch}:${LD_LIBRARY_PATH}" + # JAVA_HOME is jre + else + export LD_LIBRARY_PATH="${JAVA_HOME}/lib/${jvm_arch}/server:${JAVA_HOME}/lib/${jvm_arch}:${LD_LIBRARY_PATH}" + fi +} + +# prepare jvm if needed +setup_java_env || true + # export env variables from be.conf # # LOG_DIR diff --git a/run-be-ut.sh b/run-be-ut.sh index 453cd5d397a3f7f..74c950ef7424ea0 100755 --- a/run-be-ut.sh +++ b/run-be-ut.sh @@ -278,6 +278,35 @@ while read -r gcda_file; do rm "${gcda_file}" done < <(find "${CMAKE_BUILD_DIR}" -name "*gcda") +setup_java_env() { + local java_version + + if [[ -z "${JAVA_HOME}" ]]; then + return 1 + fi + + local jvm_arch='amd64' + if [[ "$(uname -m)" == 'aarch64' ]]; then + jvm_arch='aarch64' + fi + java_version="$( + set -e + jdk_version "${JAVA_HOME}/bin/java" + )" + if [[ "${java_version}" -gt 8 ]]; then + export LD_LIBRARY_PATH="${JAVA_HOME}/lib/server:${JAVA_HOME}/lib:${LD_LIBRARY_PATH}" + # JAVA_HOME is jdk + elif [[ -d "${JAVA_HOME}/jre" ]]; then + export LD_LIBRARY_PATH="${JAVA_HOME}/jre/lib/${jvm_arch}/server:${JAVA_HOME}/jre/lib/${jvm_arch}:${LD_LIBRARY_PATH}" + # JAVA_HOME is jre + else + export LD_LIBRARY_PATH="${JAVA_HOME}/lib/${jvm_arch}/server:${JAVA_HOME}/lib/${jvm_arch}:${LD_LIBRARY_PATH}" + fi +} + +# prepare jvm if needed +setup_java_env || true + # prepare gtest output dir GTEST_OUTPUT_DIR="${CMAKE_BUILD_DIR}/gtest_output" rm -rf "${GTEST_OUTPUT_DIR}" diff --git a/tools/find_libjvm.sh b/tools/find_libjvm.sh new file mode 100755 index 000000000000000..dca7ddae1d001bb --- /dev/null +++ b/tools/find_libjvm.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +jdk_version() { + local java_cmd="${1}" + local result + local IFS=$'\n' + + if [[ -z "${java_cmd}" ]]; then + result=no_java + return 1 + else + local version + # remove \r for Cygwin + version="$("${java_cmd}" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n' | grep version | awk '{print $3}')" + version="${version//\"/}" + if [[ "${version}" =~ ^1\. ]]; then + result="$(echo "${version}" | awk -F '.' '{print $2}')" + else + result="$(echo "${version}" | awk -F '.' '{print $1}')" + fi + fi + echo "${result}" + return 0 +} + +java_version=$(jdk_version "${JAVA_HOME:-}/bin/java") +jvm_arch='amd64' +if [[ "$(uname -m)" == 'aarch64' ]]; then + jvm_arch='aarch64' +fi +if [[ "${java_version}" -gt 8 ]]; then + export LIBJVM_PATH="${JAVA_HOME}/lib" +# JAVA_HOME is jdk +elif [[ -d "${JAVA_HOME}/jre" ]]; then + export LIBJVM_PATH="${JAVA_HOME}/jre/lib/${jvm_arch}" +# JAVA_HOME is jre +else + export LIBJVM_PATH="${JAVA_HOME}/lib/${jvm_arch}" +fi + +if [[ "$(uname -s)" != 'Darwin' ]]; then + echo "${LIBJVM_PATH}"/*/libjvm.so +else + echo "${LIBJVM_PATH}"/*/libjvm.dylib +fi \ No newline at end of file