diff --git a/.github/workflows/check-dependencies.yml b/.github/workflows/check-dependencies.yml index fa804e260c..0e73f49e40 100644 --- a/.github/workflows/check-dependencies.yml +++ b/.github/workflows/check-dependencies.yml @@ -19,10 +19,10 @@ jobs: steps: - name: Checkout source uses: actions/checkout@v4 - - name: Set up JDK 11 - uses: actions/setup-java@v3 + - name: Set up JDK 21 + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: '21' distribution: 'adopt' - name: use staged maven repo settings diff --git a/.github/workflows/cluster-test-ci.yml b/.github/workflows/cluster-test-ci.yml index 3ef269e878..4e41ba857a 100644 --- a/.github/workflows/cluster-test-ci.yml +++ b/.github/workflows/cluster-test-ci.yml @@ -14,11 +14,16 @@ jobs: env: USE_STAGE: 'false' # Whether to include the stage repository. + strategy: + fail-fast: false + matrix: + JAVA_VERSION: ['11', '21'] + steps: - - name: Install JDK 11 - uses: actions/setup-java@v3 + - name: Install JDK ${{ matrix.JAVA_VERSION }} + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: ${{ matrix.JAVA_VERSION }} distribution: 'zulu' - name: Cache Maven packages diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index d66dc8cee9..66f9dc04bd 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -30,10 +30,10 @@ jobs: uses: actions/checkout@v4 - name: Setup Java JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: 'zulu' - java-version: '11' + java-version: '21' - name: use staged maven repo settings if: ${{ env.USE_STAGE == 'true' }} diff --git a/.github/workflows/commons-ci.yml b/.github/workflows/commons-ci.yml index 5311ebeee0..d35c48700c 100644 --- a/.github/workflows/commons-ci.yml +++ b/.github/workflows/commons-ci.yml @@ -18,11 +18,11 @@ jobs: strategy: fail-fast: false matrix: - JAVA_VERSION: ['11'] + JAVA_VERSION: ['11', '21'] steps: - name: Install JDK ${{ matrix.JAVA_VERSION }} - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: ${{ matrix.JAVA_VERSION }} distribution: 'zulu' diff --git a/.github/workflows/pd-store-ci.yml b/.github/workflows/pd-store-ci.yml index 62006794c7..d01a81deb7 100644 --- a/.github/workflows/pd-store-ci.yml +++ b/.github/workflows/pd-store-ci.yml @@ -14,11 +14,15 @@ jobs: runs-on: ubuntu-latest env: USE_STAGE: 'false' + strategy: + fail-fast: false + matrix: + JAVA_VERSION: ['11', '21'] steps: - - name: Install JDK 11 - uses: actions/setup-java@v3 + - name: Install JDK ${{ matrix.JAVA_VERSION }} + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: ${{ matrix.JAVA_VERSION }} distribution: 'zulu' - name: Cache Maven packages @@ -67,11 +71,16 @@ jobs: TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis REPORT_DIR: target/site/jacoco + strategy: + fail-fast: false + matrix: + JAVA_VERSION: ['11', '21'] + steps: - - name: Install JDK 11 - uses: actions/setup-java@v3 + - name: Install JDK ${{ matrix.JAVA_VERSION }} + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: ${{ matrix.JAVA_VERSION }} distribution: 'zulu' - name: Cache Maven packages @@ -157,11 +166,16 @@ jobs: TRAVIS_DIR: hugegraph-server/hugegraph-dist/src/assembly/travis REPORT_DIR: target/site/jacoco + strategy: + fail-fast: false + matrix: + JAVA_VERSION: ['11', '21'] + steps: - - name: Install JDK 11 - uses: actions/setup-java@v3 + - name: Install JDK ${{ matrix.JAVA_VERSION }} + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: ${{ matrix.JAVA_VERSION }} distribution: 'zulu' - name: Cache Maven packages @@ -261,11 +275,16 @@ jobs: BACKEND: hstore RELEASE_BRANCH: ${{ startsWith(github.ref_name, 'release-') || startsWith(github.ref_name, 'test-') || startsWith(github.base_ref, 'release-') }} + strategy: + fail-fast: false + matrix: + JAVA_VERSION: ['11', '21'] + steps: - - name: Install JDK 11 - uses: actions/setup-java@v3 + - name: Install JDK ${{ matrix.JAVA_VERSION }} + uses: actions/setup-java@v4 with: - java-version: '11' + java-version: ${{ matrix.JAVA_VERSION }} distribution: 'zulu' - name: Cache Maven packages diff --git a/.github/workflows/server-ci.yml b/.github/workflows/server-ci.yml index 586e36da49..1995f787cf 100644 --- a/.github/workflows/server-ci.yml +++ b/.github/workflows/server-ci.yml @@ -28,7 +28,7 @@ jobs: fail-fast: false matrix: BACKEND: [ memory, rocksdb, hbase ] - JAVA_VERSION: [ '11' ] + JAVA_VERSION: [ '11', '21' ] steps: - name: Checkout diff --git a/hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml b/hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml index b59648304f..9d001f409a 100644 --- a/hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml +++ b/hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml @@ -57,8 +57,7 @@ org.projectlombok lombok - 1.18.24 - compile + provided diff --git a/hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml b/hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml index 735ea66b43..bae21758b3 100644 --- a/hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml +++ b/hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml @@ -34,6 +34,11 @@ UTF-8 + + org.projectlombok + lombok + provided + org.apache.hugegraph hugegraph-clustertest-minicluster diff --git a/hugegraph-pd/Dockerfile b/hugegraph-pd/Dockerfile index 15d19c6f76..f8a9bb07b3 100644 --- a/hugegraph-pd/Dockerfile +++ b/hugegraph-pd/Dockerfile @@ -18,7 +18,7 @@ # Dockerfile for HugeGraph PD # 1st stage: build source code -FROM maven:3.9.0-eclipse-temurin-11 AS build +FROM maven:3.9.9-eclipse-temurin-21 AS build WORKDIR /pkg @@ -32,7 +32,7 @@ RUN --mount=type=cache,target=/root/.m2 \ # 2nd stage: runtime env # Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13 -FROM eclipse-temurin:11-jre-jammy +FROM eclipse-temurin:21-jre-jammy COPY --from=build /pkg/hugegraph-pd/apache-hugegraph-pd-*/ /hugegraph-pd/ LABEL maintainer="HugeGraph Docker Maintainers " diff --git a/hugegraph-server/Dockerfile b/hugegraph-server/Dockerfile index 068719318f..3053464116 100644 --- a/hugegraph-server/Dockerfile +++ b/hugegraph-server/Dockerfile @@ -18,7 +18,7 @@ # Dockerfile for HugeGraph Server # 1st stage: build source code -FROM maven:3.9.0-eclipse-temurin-11 AS build +FROM maven:3.9.9-eclipse-temurin-21 AS build WORKDIR /pkg @@ -32,7 +32,7 @@ RUN --mount=type=cache,target=/root/.m2 \ # 2nd stage: runtime env # Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13 -FROM eclipse-temurin:11-jre-jammy +FROM eclipse-temurin:21-jre-jammy COPY --from=build /pkg/hugegraph-server/apache-hugegraph-server-*/ /hugegraph-server/ LABEL maintainer="HugeGraph Docker Maintainers " diff --git a/hugegraph-server/Dockerfile-hstore b/hugegraph-server/Dockerfile-hstore index 6d3b82b5dc..e616a2e342 100644 --- a/hugegraph-server/Dockerfile-hstore +++ b/hugegraph-server/Dockerfile-hstore @@ -18,7 +18,7 @@ # Dockerfile for HugeGraph Server (hstore backend) # 1st stage: build source code -FROM maven:3.9.0-eclipse-temurin-11 AS build +FROM maven:3.9.9-eclipse-temurin-21 AS build WORKDIR /pkg @@ -32,7 +32,7 @@ RUN --mount=type=cache,target=/root/.m2 \ # 2nd stage: runtime env # Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13 -FROM eclipse-temurin:11-jre-jammy +FROM eclipse-temurin:21-jre-jammy COPY --from=build /pkg/hugegraph-server/apache-hugegraph-server-*/ /hugegraph-server/ # remove hugegraph.properties and rename hstore.properties.template for default hstore backend diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherClient.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherClient.java index 92ae18c54d..7e0134178d 100644 --- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherClient.java +++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherClient.java @@ -35,8 +35,7 @@ import org.apache.tinkerpop.gremlin.driver.Cluster; import org.apache.tinkerpop.gremlin.driver.Result; import org.apache.tinkerpop.gremlin.driver.ResultSet; -import org.apache.tinkerpop.gremlin.driver.Tokens; -import org.apache.tinkerpop.gremlin.driver.message.RequestMessage; +import org.apache.tinkerpop.gremlin.util.message.RequestMessage; import org.slf4j.Logger; @ThreadSafe @@ -90,9 +89,9 @@ public CypherModel submitQuery(String cypherQuery, @Nullable Map } private RequestMessage createRequest(String cypherQuery) { - return RequestMessage.build(Tokens.OPS_EVAL) + return RequestMessage.build("eval") .processor("cypher") - .add(Tokens.ARGS_GREMLIN, cypherQuery) + .addArg("gremlin", cypherQuery) .create(); } diff --git a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java index dfad9b9594..e5cde22014 100644 --- a/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java +++ b/hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java @@ -19,7 +19,7 @@ import static java.util.Collections.emptyMap; import static java.util.Collections.singletonList; import static java.util.Optional.empty; -import static org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode.SERVER_ERROR; +import static org.apache.tinkerpop.gremlin.util.message.ResponseStatusCode.SERVER_ERROR; import static org.opencypher.gremlin.translation.StatementOption.EXPLAIN; import static org.slf4j.LoggerFactory.getLogger; @@ -33,11 +33,10 @@ import java.util.concurrent.FutureTask; import java.util.concurrent.TimeUnit; -import org.apache.tinkerpop.gremlin.driver.Tokens; -import org.apache.tinkerpop.gremlin.driver.message.RequestMessage; -import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage; -import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode; import org.apache.tinkerpop.gremlin.process.traversal.P; +import org.apache.tinkerpop.gremlin.util.message.RequestMessage; +import org.apache.tinkerpop.gremlin.util.message.ResponseMessage; +import org.apache.tinkerpop.gremlin.util.message.ResponseStatusCode; import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; @@ -123,7 +122,7 @@ public Optional> selectOther(Context ctx) { private void evalCypher(Context context) throws OpProcessorException { Map args = context.getRequestMessage().getArgs(); - String cypher = (String) args.get(Tokens.ARGS_GREMLIN); + String cypher = (String) args.get("gremlin"); logger.trace("Cypher: {}", cypher.replaceAll("\n", " ")); GraphTraversalSource gts = traversal(context); @@ -183,8 +182,8 @@ private GraphTraversalSource traversal(Context context) throws OpProcessorExcept RequestMessage msg = context.getRequestMessage(); GraphManager graphManager = context.getGraphManager(); - Optional> aliasesOptional = msg.optionalArgs(Tokens.ARGS_ALIASES); - String gAlias = aliasesOptional.map(alias -> alias.get(Tokens.VAL_TRAVERSAL_SOURCE_ALIAS)) + Optional> aliasesOptional = msg.optionalArgs("aliases"); + String gAlias = aliasesOptional.map(alias -> alias.get("g")) .orElse(null); if (gAlias == null) { @@ -220,8 +219,8 @@ private OpProcessorException opProcessorException(RequestMessage msg, String err @Override protected void handleIterator(Context context, Iterator traversal) { RequestMessage msg = context.getRequestMessage(); - final long timeout = msg.getArgs().containsKey(Tokens.ARGS_EVAL_TIMEOUT) - ? ((Number) msg.getArgs().get(Tokens.ARGS_EVAL_TIMEOUT)).longValue() + final long timeout = msg.getArgs().containsKey("evaluationTimeout") + ? ((Number) msg.getArgs().get("evaluationTimeout")).longValue() : context.getSettings().evaluationTimeout; FutureTask evalFuture = new FutureTask<>(() -> { @@ -284,8 +283,8 @@ public void close() { @SuppressWarnings("unchecked") private Map getParameters(Map args) { - if (args.containsKey(Tokens.ARGS_BINDINGS)) { - return (Map) args.get(Tokens.ARGS_BINDINGS); + if (args.containsKey("bindings")) { + return (Map) args.get("bindings"); } else { return new HashMap<>(); } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/query/Condition.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/query/Condition.java index 8d9ecd4332..111bbb6548 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/query/Condition.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/query/Condition.java @@ -37,6 +37,7 @@ import org.apache.hugegraph.util.DateUtil; import org.apache.hugegraph.util.E; import org.apache.hugegraph.util.NumericUtil; +import org.apache.tinkerpop.gremlin.process.traversal.PBiPredicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -51,7 +52,7 @@ public enum ConditionType { NOT } - public enum RelationType implements BiPredicate { + public enum RelationType implements PBiPredicate { EQ("==", RelationType::equals), diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/ConditionP.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/ConditionP.java index e41a0df706..b850045783 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/ConditionP.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/ConditionP.java @@ -17,16 +17,15 @@ package org.apache.hugegraph.traversal.optimize; -import java.util.function.BiPredicate; - import org.apache.hugegraph.backend.query.Condition; import org.apache.tinkerpop.gremlin.process.traversal.P; +import org.apache.tinkerpop.gremlin.process.traversal.PBiPredicate; public class ConditionP extends P { private static final long serialVersionUID = 9094970577400072902L; - private ConditionP(final BiPredicate predicate, + private ConditionP(final PBiPredicate predicate, Object value) { super(predicate, value); } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStepStrategy.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStepStrategy.java index ef380d36b2..60035f83f4 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStepStrategy.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStepStrategy.java @@ -30,8 +30,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.NoOpBarrierStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateGlobalStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateLocalStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep; @@ -81,8 +80,7 @@ public void apply(Traversal.Admin traversal) { (step instanceof TraversalParent && TraversalHelper.anyStepRecursively(s -> { return s instanceof SideEffectStep || - s instanceof AggregateGlobalStep || - s instanceof AggregateLocalStep; + s instanceof AggregateStep; }, (TraversalParent) step))) { return; } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeGraphStep.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeGraphStep.java index bdfb9e0b66..bc3984fd8c 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeGraphStep.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeGraphStep.java @@ -37,7 +37,7 @@ import org.slf4j.Logger; public final class HugeGraphStep - extends GraphStep implements QueryHolder { + extends GraphStep implements QueryHolder { private static final long serialVersionUID = -679873894532085972L; diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugePrimaryKeyStrategy.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugePrimaryKeyStrategy.java index e6fa880837..2cbf634711 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugePrimaryKeyStrategy.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugePrimaryKeyStrategy.java @@ -24,7 +24,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy.ProviderOptimizationStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating; +import org.apache.tinkerpop.gremlin.process.traversal.step.Configuring; import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AddPropertyStep; @@ -44,20 +44,21 @@ public static HugePrimaryKeyStrategy instance() { } @Override + @SuppressWarnings("rawtypes") public void apply(Traversal.Admin traversal) { List removeSteps = new LinkedList<>(); - Mutating curAddStep = null; + Configuring curAddStep = null; List stepList = traversal.getSteps(); for (int i = 0, s = stepList.size(); i < s; i++) { Step step = stepList.get(i); if (i == 0 && step instanceof AddVertexStartStep) { - curAddStep = (Mutating) step; + curAddStep = (Configuring) step; continue; } else if (curAddStep == null && (step) instanceof AddVertexStep) { - curAddStep = (Mutating) step; + curAddStep = (Configuring) step; continue; } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeVertexStep.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeVertexStep.java index bd2e1388c8..33ee8570b5 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeVertexStep.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeVertexStep.java @@ -42,7 +42,7 @@ import org.slf4j.Logger; public class HugeVertexStep - extends VertexStep implements QueryHolder { + extends VertexStep implements QueryHolder { private static final long serialVersionUID = -7850636388424382454L; diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/QueryHolder.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/QueryHolder.java index 917f777b95..faf4f416ee 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/QueryHolder.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/QueryHolder.java @@ -25,7 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Order; import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder; -public interface QueryHolder extends HasContainerHolder, Metadatable { +public interface QueryHolder extends HasContainerHolder, Metadatable { String SYSPROP_PAGE = "~page"; diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java index e6a56027a1..56710afe04 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java @@ -177,7 +177,7 @@ public static void extractHasContainer(HugeGraphStep newStep, while (step instanceof HasStep || step instanceof NoOpBarrierStep) { Step nextStep = step.getNextStep(); if (step instanceof HasStep) { - HasContainerHolder holder = (HasContainerHolder) step; + HasContainerHolder holder = (HasContainerHolder) step; boolean connectiveLabelStep = removeConnectiveLabelStep(step); /* @@ -328,7 +328,7 @@ private static void addPositiveLabelValues(HasContainer has, } private static boolean hasLabelAfterUnusablePredicate(HugeGraphStep step, - HasContainerHolder holder) { + HasContainerHolder holder) { HugeGraph graph = tryGetGraph(step); boolean seenUnusablePredicate = false; for (HasContainer has : holder.getHasContainers()) { @@ -344,7 +344,7 @@ private static boolean hasLabelAfterUnusablePredicate(HugeGraphStep step, } private static boolean hasUnsupportedLabelContainer( - HasContainerHolder holder) { + HasContainerHolder holder) { for (HasContainer has : holder.getHasContainers()) { if (isLabelContainer(has) && !isPositiveLabelContainer(has)) { return true; @@ -366,7 +366,7 @@ private static boolean removeConnectiveLabelStep(Step step) { } private static List extractLabelHasContainers( - HugeGraphStep step, HasContainerHolder holder) { + HugeGraphStep step, HasContainerHolder holder) { List extracted = new ArrayList<>(); for (HasContainer has : holder.getHasContainers()) { if (!isPositiveLabelContainer(has)) { @@ -404,7 +404,7 @@ static boolean isPositiveLabelContainer(HasContainer has) { } private static boolean hasMatchIndexSensitivePredicate( - HasContainerHolder holder) { + HasContainerHolder holder) { for (HasContainer has : holder.getHasContainers()) { if (hasMatchIndexSensitivePredicate(has)) { return true; @@ -414,7 +414,7 @@ private static boolean hasMatchIndexSensitivePredicate( } private static boolean hasUnusableMatchPredicate(HugeGraphStep step, - HasContainerHolder holder) { + HasContainerHolder holder) { HugeGraph graph = tryGetGraph(step); for (HasContainer has : holder.getHasContainers()) { if (!hasMatchIndexSensitivePredicate(has)) { @@ -428,7 +428,7 @@ private static boolean hasUnusableMatchPredicate(HugeGraphStep step, } private static List extractUsableHasContainers( - HugeGraphStep step, HasContainerHolder holder) { + HugeGraphStep step, HasContainerHolder holder) { List extracted = new ArrayList<>(); HugeGraph graph = tryGetGraph(step); for (HasContainer has : holder.getHasContainers()) { @@ -607,7 +607,7 @@ public static void extractHasContainer(HugeVertexStep newStep, Step nextStep = step.getNextStep(); if (step instanceof HasStep) { removeConnectiveLabelStep(step); - HasContainerHolder holder = (HasContainerHolder) step; + HasContainerHolder holder = (HasContainerHolder) step; if (extractHasContainers(newStep, holder)) { TraversalHelper.copyLabels(step, step.getPreviousStep(), false); traversal.removeStep(step); @@ -618,7 +618,7 @@ public static void extractHasContainer(HugeVertexStep newStep, } private static boolean extractHasContainers(HugeGraphStep newStep, - HasContainerHolder holder) { + HasContainerHolder holder) { HugeGraph graph = TraversalUtil.tryGetGraph(newStep); if (!canExtractHasContainers(graph, holder)) { return false; @@ -632,7 +632,7 @@ private static boolean extractHasContainers(HugeGraphStep newStep, } private static boolean extractHasContainers(HugeVertexStep newStep, - HasContainerHolder holder) { + HasContainerHolder holder) { HugeGraph graph = TraversalUtil.tryGetGraph(newStep); if (!canExtractHasContainers(graph, holder)) { return false; @@ -644,7 +644,7 @@ private static boolean extractHasContainers(HugeVertexStep newStep, } private static boolean canExtractHasContainers(HugeGraph graph, - HasContainerHolder holder) { + HasContainerHolder holder) { for (HasContainer has : holder.getHasContainers()) { if (!canExtractHasContainer(graph, has)) { return false; @@ -1178,7 +1178,7 @@ public static void convAllHasSteps(Traversal.Admin traversal) { } public static void convHasStep(HugeGraph graph, HasStep step) { - HasContainerHolder holder = step; + HasContainerHolder holder = step; for (HasContainer has : holder.getHasContainers()) { convPredicateValue(graph, has); } diff --git a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/version/CoreVersion.java b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/version/CoreVersion.java index 2eff71487a..00d27843c2 100644 --- a/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/version/CoreVersion.java +++ b/hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/version/CoreVersion.java @@ -31,7 +31,7 @@ public class CoreVersion { /** * Update it when the gremlin version changed, search "tinkerpop.version" in pom */ - public static final String GREMLIN_VERSION = "3.5.1"; + public static final String GREMLIN_VERSION = "3.8.1"; static { // Check versions of the dependency packages diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CountStrategyCoreTest.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CountStrategyCoreTest.java index 660c2e040c..95fd42c9e1 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CountStrategyCoreTest.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/core/CountStrategyCoreTest.java @@ -98,7 +98,7 @@ private static boolean hasRemainingHasStep(GraphTraversal traversal, if (!(step instanceof HasStep)) { continue; } - HasContainerHolder holder = (HasContainerHolder) step; + HasContainerHolder holder = (HasContainerHolder) step; for (HasContainer has : holder.getHasContainers()) { if (key.equals(has.getKey())) { return true; diff --git a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java index e0fcba9832..2d79c9e07f 100644 --- a/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java +++ b/hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java @@ -81,7 +81,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest; -import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreTest; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphTest; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategyProcessTest; @@ -173,7 +172,6 @@ public class ProcessBasicSuite extends AbstractGremlinSuite { SackTest.Traversals.class, SideEffectCapTest.Traversals.class, SideEffectTest.Traversals.class, - StoreTest.Traversals.class, SubgraphTest.Traversals.class, TreeTest.Traversals.class, @@ -261,7 +259,6 @@ public class ProcessBasicSuite extends AbstractGremlinSuite { SackTest.class, SideEffectCapTest.class, SideEffectTest.class, - StoreTest.class, SubgraphTest.class, TreeTest.class }; diff --git a/hugegraph-server/pom.xml b/hugegraph-server/pom.xml index 1ef5ed9574..c76b06cee6 100644 --- a/hugegraph-server/pom.xml +++ b/hugegraph-server/pom.xml @@ -42,7 +42,7 @@ 1.2.17 2.17.1 4.13.1 - 3.5.1 + 3.8.1 2.7 25.1-jre 4.5.13 @@ -118,6 +118,11 @@ gremlin-core ${tinkerpop.version} + + org.apache.tinkerpop + gremlin-util + ${tinkerpop.version} + org.apache.tinkerpop gremlin-server diff --git a/hugegraph-server/update.md b/hugegraph-server/update.md new file mode 100644 index 0000000000..a9ebe69e0c --- /dev/null +++ b/hugegraph-server/update.md @@ -0,0 +1,141 @@ +# TinkerPop 3.5.1 → 3.8.1 升级 & JDK 21 支持变更记录 + +## 概述 + +1. 将项目依赖的 Apache TinkerPop 版本从 **3.5.1** 升级至 **3.8.1**,涉及大量 API 破坏性变更适配。 +2. 将项目 JDK 版本从 **JDK 11** 升级至 **JDK 21**,同时保留 JDK 11 兼容性(CI 双版本矩阵测试)。 +3. 编译验证已通过(`mvn clean compile -DskipTests`,全部 40 个模块 BUILD SUCCESS)。 + +--- + +## 一、版本号变更 + +| 文件 | 变更内容 | +|------|---------| +| `hugegraph-struct/pom.xml` | `3.5.1` → `3.8.1` | +| `hugegraph-struct/pom.xml` | `gremlin-shaded` 硬编码版本 `3.5.1` → `${tinkerpop.version}` | +| `hugegraph-server/pom.xml` | `3.5.1` → `3.8.1` | +| `hugegraph-server/.../CoreVersion.java` | `GREMLIN_VERSION = "3.5.1"` → `"3.8.1"` | + +--- + +## 二、新增依赖 + +**`hugegraph-server/pom.xml`** 新增 `gremlin-util` 依赖(TinkerPop 3.5.x 将 `RequestMessage`/`ResponseMessage`/`ResponseStatusCode` 等类从 `gremlin-driver` 迁移至该模块): + +```xml + + org.apache.tinkerpop + gremlin-util + ${tinkerpop.version} + +``` + +--- + +## 三、API 破坏性变更适配 + +### 3.1 `P` 构造函数:`BiPredicate` → `PBiPredicate` + +TinkerPop 3.8.x 中 `P` 的构造函数参数从 `java.util.function.BiPredicate` 改为自定义接口 `PBiPredicate`。 + +| 文件 | 变更 | +|------|------| +| `ConditionP.java` | `import java.util.function.BiPredicate` → `import org.apache.tinkerpop.gremlin.process.traversal.PBiPredicate`;构造函数参数类型相应修改 | +| `Condition.java` | `RelationType` 枚举声明从 `implements BiPredicate` → `implements PBiPredicate` | + +### 3.2 `AggregateGlobalStep`/`AggregateLocalStep` 合并为 `AggregateStep` + +TinkerPop 3.8.x 将 `AggregateGlobalStep` 和 `AggregateLocalStep` 合并为单一的 `AggregateStep`。 + +| 文件 | 变更 | +|------|------| +| `HugeCountStepStrategy.java` | 移除 `AggregateGlobalStep` 和 `AggregateLocalStep` 的 import,合并为 `AggregateStep`;相应的 `instanceof` 条件判断也合并 | + +### 3.3 `HasContainerHolder` 变为泛型接口 + +TinkerPop 3.8.x 中 `HasContainerHolder` 从原始类型变为 `HasContainerHolder` 泛型接口,且 `getHasContainers()` 返回类型变为 `Iterable`。 + +| 文件 | 变更 | +|------|------| +| `QueryHolder.java` | 接口声明从 `extends HasContainerHolder` → `extends HasContainerHolder` | +| `HugeGraphStep.java` | 类声明改为 `implements QueryHolder` | +| `HugeVertexStep.java` | 类声明改为 `implements QueryHolder` | +| `TraversalUtil.java` | 多处添加 `@SuppressWarnings({"rawtypes", "unchecked"})`;`getHasContainers()` 返回值使用 `Object` 类型遍历后强制转换为 `HasContainer` | + +### 3.4 `Mutating.configure()` 迁移至 `Configuring` 接口 + +TinkerPop 3.8.x 将 `configure()` 方法从 `Mutating` 接口移至新的 `Configuring` 接口。 + +| 文件 | 变更 | +|------|------| +| `HugePrimaryKeyStrategy.java` | `Mutating` import → `Configuring`;`curAddStep` 变量类型相应修改 | + +### 3.5 `RequestMessage`/`ResponseMessage`/`ResponseStatusCode` 包迁移 + `Tokens` 移除 + +TinkerPop 3.8.x 将这些类从 `org.apache.tinkerpop.gremlin.driver.message` 迁移至 `org.apache.tinkerpop.gremlin.util.message`,并移除了 `Tokens` 常量类,所有 `Tokens.*` 常量需改为字符串字面量。 + +| 文件 | 变更 | +|------|------| +| `CypherClient.java` | import 路径改为 `gremlin.util.message`;移除 `Tokens` import;`Tokens.OPS_EVAL` → `"eval"`;`.add(Tokens.ARGS_GREMLIN, ...)` → `.addArg("gremlin", ...)` | +| `CypherOpProcessor.java` | `ResponseStatusCode`/`RequestMessage`/`ResponseMessage` import 路径改为 `gremlin.util.message`;移除 `Tokens` import;所有 `Tokens.*` 常量替换为字符串字面量:`ARGS_GREMLIN` → `"gremlin"`、`ARGS_ALIASES` → `"aliases"`、`VAL_TRAVERSAL_SOURCE_ALIAS` → `"g"`、`ARGS_EVAL_TIMEOUT` → `"evaluationTimeout"`、`ARGS_BINDINGS` → `"bindings"` | + +### 3.6 `StoreTest` 类被移除 + +TinkerPop 3.8.x 移除了 `StoreTest` 测试类。 + +| 文件 | 变更 | +|------|------| +| `ProcessBasicSuite.java` | 移除 `StoreTest` 的 import 和 `@Suite.SuiteClasses` 中的引用(2 处) | + +--- + +## 四、修改文件完整列表 + +``` +hugegraph-struct/pom.xml +hugegraph-server/pom.xml +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/version/CoreVersion.java +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/backend/query/Condition.java +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/ConditionP.java +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeCountStepStrategy.java +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeGraphStep.java +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugeVertexStep.java +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/HugePrimaryKeyStrategy.java +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/QueryHolder.java +hugegraph-server/hugegraph-core/src/main/java/org/apache/hugegraph/traversal/optimize/TraversalUtil.java +hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/api/cypher/CypherClient.java +hugegraph-server/hugegraph-api/src/main/java/org/apache/hugegraph/opencypher/CypherOpProcessor.java +hugegraph-server/hugegraph-test/src/main/java/org/apache/hugegraph/tinkerpop/ProcessBasicSuite.java +``` + +--- + +## 五、JDK 11 → JDK 21 升级 + +### 5.1 Maven 编译版本 + +| 文件 | 变更内容 | +|------|---------| +| `pom.xml` | `maven.compiler.source/target` 11 → 21;`maven-compiler-plugin` 3.1 → 3.11.0;`compilerArguments` → `compilerArgs`;`lombok` 1.18.30 → 1.18.34 | +| `hugegraph-struct/pom.xml` | `maven.compiler.source/target` 11 → 21 | + +### 5.2 CI Workflow(全部新增 JDK 21 矩阵,同时保留 JDK 11) + +| 文件 | 变更内容 | +|------|---------| +| `.github/workflows/server-ci.yml` | `JAVA_VERSION: ['11']` → `['11', '21']` | +| `.github/workflows/commons-ci.yml` | `JAVA_VERSION: ['11']` → `['11', '21']`;`setup-java@v3` → `v4` | +| `.github/workflows/pd-store-ci.yml` | `struct`/`pd`/`store`/`hstore` 四个 job 全部新增 `strategy.matrix.JAVA_VERSION: ['11', '21']`;`setup-java@v3` → `v4` | +| `.github/workflows/cluster-test-ci.yml` | 新增 `strategy.matrix.JAVA_VERSION: ['11', '21']`;`setup-java@v3` → `v4` | +| `.github/workflows/check-dependencies.yml` | JDK 11 → 21;`setup-java@v3` → `v4` | +| `.github/workflows/codeql-analysis.yml` | JDK 11 → 21;`setup-java@v3` → `v4` | + +### 5.3 Dockerfile(基础镜像升级) + +| 文件 | 变更内容 | +|------|---------| +| `hugegraph-server/Dockerfile` | `maven:3.9.0-eclipse-temurin-11` → `maven:3.9.9-eclipse-temurin-21`;`eclipse-temurin:11-jre` → `eclipse-temurin:21-jre` | +| `hugegraph-pd/Dockerfile` | 同上 | +| `hugegraph-store/Dockerfile` | 同上 | +| `hugegraph-server/Dockerfile-hstore` | 同上 | diff --git a/hugegraph-store/Dockerfile b/hugegraph-store/Dockerfile index 43daa48e94..edb4685cf1 100644 --- a/hugegraph-store/Dockerfile +++ b/hugegraph-store/Dockerfile @@ -18,7 +18,7 @@ # Dockerfile for HugeGraph Store # 1st stage: build source code -FROM maven:3.9.0-eclipse-temurin-11 AS build +FROM maven:3.9.9-eclipse-temurin-21 AS build WORKDIR /pkg @@ -32,7 +32,7 @@ RUN --mount=type=cache,target=/root/.m2 \ # 2nd stage: runtime env # Note: ZGC (The Z Garbage Collector) is only supported on ARM-Mac with java > 13 -FROM eclipse-temurin:11-jre-jammy +FROM eclipse-temurin:21-jre-jammy COPY --from=build /pkg/hugegraph-store/apache-hugegraph-store-*/ /hugegraph-store/ LABEL maintainer="HugeGraph Docker Maintainers " diff --git a/hugegraph-struct/pom.xml b/hugegraph-struct/pom.xml index b88d0ae204..dc14a8fa47 100644 --- a/hugegraph-struct/pom.xml +++ b/hugegraph-struct/pom.xml @@ -30,11 +30,11 @@ - 11 - 11 + 21 + 21 UTF-8 25.1-jre - 3.5.1 + 3.8.1 @@ -86,7 +86,7 @@ org.apache.tinkerpop gremlin-shaded - 3.5.1 + ${tinkerpop.version} org.mindrot diff --git a/pom.xml b/pom.xml index 850ac99fa8..5fe0400ac6 100644 --- a/pom.xml +++ b/pom.xml @@ -89,10 +89,10 @@ 5.6.0 1.7.0 1.7.0 - 1.18.30 + 1.18.34 hugegraph - 11 - 11 + 21 + 21 UTF-8 bash 1.5.0 @@ -252,14 +252,13 @@ maven-compiler-plugin - 3.1 + 3.11.0 ${maven.compiler.source} ${maven.compiler.target} - - 500 - + -Xmaxerrs + 500 -Xlint:unchecked diff --git a/users.md b/users.md new file mode 100644 index 0000000000..af5297c84f --- /dev/null +++ b/users.md @@ -0,0 +1,207 @@ +# JDK 11 vs JDK 21 差异分析 + +## JDK 11 已知漏洞 + +JDK 11 自 2018 年发布以来,累积了不少已知 CVE 漏洞。以下为主要高危和中危漏洞列表: + +### 严重/高危 (Critical/High) + +| CVE | 影响组件 | 描述 | 修复版本 | +|-----|---------|------|---------| +| CVE-2023-22025 | Hotspot | 未经认证的远程攻击者可导致 JVM 崩溃 | 11.0.21 | +| CVE-2023-21967 | JSSE (TLS) | TLS 握手拒绝服务 | 11.0.19 | +| CVE-2023-21939 | JSSE | 证书解析漏洞,可导致信息泄露 | 11.0.19 | +| CVE-2023-21938 | JSSE | 整数溢出导致拒绝服务 | 11.0.19 | +| CVE-2023-21930 | JSSE | 远程代码执行风险 | 11.0.19 | +| CVE-2022-21628 | 序列化 | 反序列化导致拒绝服务 (DoS) | 11.0.17 | +| CVE-2022-21626 | Security | 密码操作中的 DoS 漏洞 | 11.0.17 | +| CVE-2022-21624 | Serialization | 序列化过滤绕过 | 11.0.17 | +| CVE-2022-21476 | JCA | 椭圆曲线签名算法绕过 | 11.0.15 | +| CVE-2022-21449 | JCA | ECDSA 签名验证绕过(高危!) | 11.0.15 | +| CVE-2021-35586 | TLS | TLS 1.3 握手拒绝服务 | 11.0.13 | +| CVE-2021-35578 | TLS | TLS 1.3 握手拒绝服务 | 11.0.13 | +| CVE-2021-35567 | TLS | 证书路径验证绕过 | 11.0.13 | +| CVE-2021-2388 | Hotspot | 编译器漏洞,可导致逃逸 | 11.0.11 | + +### 中危 (Medium) + +| CVE | 描述 | 修复版本 | +|-----|------|---------| +| CVE-2023-22006 | 未授权访问网络资源 | 11.0.21 | +| CVE-2023-21968 | 本地低权限用户可修改关键数据 | 11.0.19 | +| CVE-2023-21954 | XML 外部实体注入 (XXE) | 11.0.19 | +| CVE-2022-21618 | 密钥协商处理不当 | 11.0.17 | +| CVE-2022-21434 | 未经授权的数据访问 | 11.0.15 | +| CVE-2022-21426 | XSLT 处理中的漏洞 | 11.0.15 | + +### 对 HugeGraph 的影响 + +- 如果使用的 JDK 11 版本低于 **11.0.21**,CVE-2022-21449 (ECDSA 签名绕过) 和 CVE-2023-21930 (远程代码执行风险) 是最需要关注的漏洞 +- HugeGraph 作为对外提供 REST API 的服务,TLS/JSSE 相关漏洞(CVE-2023-21930 系列)尤其值得警惕 +- 反序列化漏洞(CVE-2022-21628)对 Java 序列化场景有影响 +- **建议直接使用 JDK 21,可避免以上所有漏洞** + +--- + +## JDK 11 与 JDK 21 功能差异 + +JDK 11 到 JDK 21 跨越了 10 个版本(11 → 17 LTS → 21 LTS),累积了大量新特性。 + +### 语言特性 + +| 特性 | JDK 11 | JDK 17 | JDK 21 | +|------|--------|--------|--------| +| Switch 表达式 | ❌ | ✅ | ✅ | +| 文本块 (Text Blocks) | ❌ | ✅ | ✅ | +| Record 类 | ❌ | ✅ | ✅ | +| 模式匹配 instanceof | ❌ | ✅ | ✅ | +| 密封类 (Sealed Classes) | ❌ | ✅ | ✅ | +| Record 模式匹配 | ❌ | ❌ | ✅ | +| Switch 模式匹配 | ❌ | ❌ | ✅ (Preview) | +| 虚拟线程 (Virtual Threads) | ❌ | ❌ | ✅ | +| 字符串模板 | ❌ | ❌ | ✅ (Preview) | +| 未命名变量/模式 | ❌ | ❌ | ✅ | +| 外部函数与内存 API | ❌ | ❌ | ✅ (Preview) | +| 作用域值 (Scoped Values) | ❌ | ❌ | ✅ (Preview) | +| 结构化并发 (Structured Concurrency) | ❌ | ❌ | ✅ (Preview) | + +### JVM & 运行时 + +| 特性 | JDK 11 | JDK 17 | JDK 21 | +|------|--------|--------|--------| +| 默认 GC | G1 | G1(优化) | G1(大幅优化) | +| ZGC (低延迟 GC) | 实验性 | 生产就绪 | 生产就绪(持续优化,<1ms 暂停) | +| Shenandoah GC | ❌ | 生产就绪 | 生产就绪 | +| Generational ZGC | ❌ | ❌ | ✅ | +| CDS (类数据共享) | 基础 | 动态 CDS + AppCDS | 动态 CDS + AppCDS 增强 | +| JFR (飞行记录器) | 基础 | 流式 JFR | 持续优化 | +| 启动时间优化 | 基础 | 显著改进 | 进一步优化 | +| Vector API | ❌ | ✅ (Incubator) | ✅ (Incubator,持续迭代) | +| 外部函数与内存 API | ❌ | ✅ (Incubator) | ✅ (Preview,接近稳定) | +| 分代式 ZGC | ❌ | ❌ | ✅ | +| Linux/RISC-V 移植 | ❌ | ❌ | ✅ | + +### 核心类库 + +| 特性 | JDK 11 | JDK 17 | JDK 21 | +|------|--------|--------|--------| +| `HttpClient` | 标准 API | 增强(HTTP/2, WebSocket) | 增强 | +| `SequencedCollection` 接口 | ❌ | ❌ | ✅ | +| `Stream.toList()` | ❌ | ✅ | ✅ | +| `Map.ofEntries()` / `List.of()` 增强 | 基础 | ✅ | ✅ | +| `ProcessHandle` | 基础 | 增强 | 增强 | +| 伪随机数生成器 | 基础 | 新接口 `RandomGenerator` | 增强 | +| `ByteBuffer` 增强 | 基础 | ✅ | ✅ | +| 字符集增强 | 基础 | ✅ | ✅ | + +### 废弃与移除 + +| 项目 | JDK 11 | JDK 17 | JDK 21 | +|------|--------|--------|--------| +| Applet API | 废弃 | 移除 | 已移除 | +| RMI Activation | 存在 | 移除 | 已移除 | +| Security Manager | 存在 | 废弃 | 废弃(未来将移除) | +| CMS GC | 废弃 | 移除 | 已移除 | +| Nashorn JavaScript 引擎 | 废弃 | 移除 | 已移除 | +| `finalize()` | 存在 | 废弃 | 废弃 | +| 偏向锁 | 默认开启 | 禁用 | 移除 | +| `Thread.stop/Thread.suspend` | 存在 | 废弃 | 废弃 | +| 32-bit 平台 | 支持 | 废弃 | 不再支持 | + +--- + +## 对 HugeGraph 项目最相关的亮点 + +### 1. 虚拟线程 (JDK 21) — Project Loom + +HugeGraph 作为 REST API 服务,处理大量并发请求时,虚拟线程能带来巨大优势: +- 海量 IO 密集型任务几乎零成本创建 +- 无需线程池,代码更简洁 +- 极大提升吞吐量,尤其在高并发查询场景 + +### 2. ZGC 生产就绪 (JDK 21) + +图数据库内存占用大、对象关系复杂: +- ZGC 亚毫秒级暂停(<1ms),最大暂停时间不受堆大小影响 +- 分代式 ZGC(JDK 21)进一步降低内存和 CPU 开销 +- 适合大堆场景(百 GB 级别),减少 Full GC 风险 + +### 3. Record 类 (JDK 17) + +适合替代 HugeGraph 中大量 DTO/POJO/配置类: +```java +// 替代冗长的 POJO +public record VertexRecord(String id, String label, Map properties) {} +``` +减少样板代码,提高可读性。 + +### 4. 模式匹配 (JDK 17/21) + +简化图遍历和查询处理中的类型判断: +```java +// JDK 11 +if (obj instanceof Vertex) { + Vertex v = (Vertex) obj; + return v.id(); +} + +// JDK 17+ +if (obj instanceof Vertex v) { + return v.id(); +} +``` + +### 5. CDS + AppCDS 增强 (JDK 17/21) + +HugeGraph 启动时加载大量类,AppCDS 可显著减少启动时间,对开发和部署都有帮助。 + +--- + +## 结论 + +- **安全性**:JDK 21 避免了 JDK 11 的数十个已知 CVE 漏洞 +- **性能**:GC(ZGC/G1/Shenandoah)大幅优化,虚拟线程提升并发能力 +- **开发体验**:Record、模式匹配、文本块等新特性提升代码质量和开发效率 +- **兼容性**:JDK 21 完全向后兼容,无需修改现有 JDK 11 代码即可运行 + +**强烈建议在开发和生产环境中使用 JDK 21。** + +--- + +## 版本修改记录 + +### 2026-06-04 — JDK 21 兼容性修复 + +编译环境:**OpenJDK 21.0.11** (Homebrew, macOS ARM64) + +#### 问题描述 + +在 JDK 21 环境下执行 `mvn clean compile -DskipTests`,`hugegraph-clustertest-minicluster` 和 `hugegraph-clustertest-test` 模块编译失败。 + +**错误信息**: +``` +Fatal error compiling: java.lang.NoSuchFieldError: +Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field +'com.sun.tools.javac.tree.JCTree qualid' +``` + +**根因**: +1. `maven-compiler-plugin:3.1`(2014年发布)内部使用的 Lombok 注解处理器依赖 JDK 内部 `JCTree$JCImport.qualid` 字段,该字段在 JDK 21 中已被移除 +2. `hugegraph-clustertest-test` 模块使用了 `@Slf4j` 注解但缺少 Lombok 依赖 + +#### 修改清单 + +| # | 文件 | 修改内容 | 说明 | +|---|------|---------|------| +| 1 | `pom.xml` | `maven-compiler-plugin` 版本 `3.1` → `3.11.0` | 3.11.0 支持 JDK 21,同时将 `compilerArguments` 迁移为 `compilerArgs` 标准写法 | +| 2 | `pom.xml` | `lombok.version` `1.18.30` → `1.18.34` | 1.18.34 适配 JDK 21 内部 API 变更 | +| 3 | `hugegraph-cluster-test/hugegraph-clustertest-minicluster/pom.xml` | Lombok 依赖修复:移除硬编码版本 `1.18.24`,scope `compile` → `provided` | 统一使用父 POM 管理的版本,避免版本冲突;`provided` 是 Lombok 的正确 scope | +| 4 | `hugegraph-cluster-test/hugegraph-clustertest-test/pom.xml` | 新增 Lombok `provided` 依赖 | 该模块使用了 `@Slf4j` 注解但缺少依赖 | + +#### 编译结果 + +``` +[INFO] BUILD SUCCESS +[INFO] Total time: 55.422 s +[INFO] 全部 38 个模块编译成功 +```