Skip to content

SDK 4.12 AIO isn't compatible with hotswap agent #731

@Mr-DeBonis

Description

@Mr-DeBonis

Since new versions of alfresco are based on jdk 17, the new instructions from the hotswap agent repo must be followed. So, to implement that, I modified my sample-project-platform-docker/dockerfile like this:

# HOTSWAP AGENT
COPY jbr_jcef-17.0.14-linux-x64-b1367.22.tar.gz $TOMCAT_DIR
RUN tar -xvf $TOMCAT_DIR/jbr_jcef-17.0.14-linux-x64-b1367.22.tar.gz -C /usr/lib/jvm/ && \
    rm $TOMCAT_DIR/jbr_jcef-17.0.14-linux-x64-b1367.22.tar.gz && \
    alternatives --install /usr/bin/java java /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22/bin/java 40000 && \
    alternatives --install /usr/bin/javac javac /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22/bin/javac 40000 && \
    alternatives --install /usr/bin/jar jar /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22/bin/jar 40000 && \
    alternatives --set java /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22/bin/java && \
    alternatives --set javac /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22/bin/javac && \
    alternatives --set jar /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22/bin/jar && \
    ln -sfn /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22 /etc/alternatives/jre && \
    ln -sfn /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22 /usr/lib/jvm/latest && \
    ln -sfn /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22 /usr/lib/jvm/default

COPY hotswap-agent-2.0.0.jar /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22/lib/hotswap/hotswap-agent.jar
# Copy the configuration properties file in the classpath
COPY hotswap-agent.properties $TOMCAT_DIR/webapps/alfresco/WEB-INF/classes


# Set the JAVA_HOME so Tomcat knows which JDK to use
ENV JAVA_HOME=/usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22
ENV PATH="${JAVA_HOME}/bin:${PATH}"

# Ensure the alfresco user can access the new files
RUN chown -R ${USERNAME}:${USERNAME} /usr/lib/jvm/jbr_jcef-17.0.14-linux-x64-b1367.22

Then the docker-compose.yml like this:

  sample-project-acs:
    image: alfresco-content-services-sample-project:development
    build:
      dockerfile: ./Dockerfile
      context: ../../../sample-project-platform-docker/target
    environment:
      CATALINA_OPTS: "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888 -XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar"
    command: [ "catalina.sh", "run" ]
    ports:
      - "${acs.port}:8080"
      - "${acs.debug.port}:8888"
    volumes:
      - sample-project-acs-volume:/usr/local/tomcat/alf_data
      - ../../../sample-project-platform/target/classes:/usr/local/tomcat/hotswap-agent/sample-project-platform/target/classes
      - ../../../sample-project-integration-tests/target/test-classes:/usr/local/tomcat/hotswap-agent/sample-project-integration-tests/target/test-classes

I see the Hotswap agent load, but Tomcat fails to start its child:

  05-Jan-2026 20:03:33.552 INFO [main] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/tomcat/webapps/alfresco]
    sample-project-acs-1       | 05-Jan-2026 20:03:33.553 SEVERE [main] org.apache.catalina.startup.HostConfig.deployDirectory The web application with context path [/alfresco] was not deployed because it contained a deployment descriptor [/usr/local/tomcat/webapps/alfresco/META-INF/context.xml] which may include configuration necessary for the secure deployment of the application but processing of deployment descriptors is prevented by the deployXML setting of this host. An appropriate descriptor should be created at [/usr/local/tomcat/conf/Catalina/localhost/alfresco.xml] to deploy this application.
    sample-project-acs-1       | 05-Jan-2026 20:03:33.662 SEVERE [main] org.apache.catalina.startup.HostConfig.deployDirectory Error deploying web application directory [/usr/local/tomcat/webapps/alfresco]
  sample-project-acs-1       |    java.lang.IllegalStateException: Error starting child
    sample-project-acs-1       |            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:602)
    sample-project-acs-1       |            at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:571)
    sample-project-acs-1       |            at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:654)
    sample-project-acs-1       |            at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1126)
    sample-project-acs-1       |            at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1925)
    sample-project-acs-1       |            at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
    sample-project-acs-1       |            at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    sample-project-acs-1       |            at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    sample-project-acs-1       |            at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
    sample-project-acs-1       |            at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1037)
    sample-project-acs-1       |            at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:422)
    sample-project-acs-1       |            at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1621)
    sample-project-acs-1       |            at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:303)
    sample-project-acs-1       |            at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:109)
    sample-project-acs-1       |            at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:389)
    sample-project-acs-1       |            at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:336)
    sample-project-acs-1       |            at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:776)
    sample-project-acs-1       |            at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:772)
    sample-project-acs-1       |            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    sample-project-acs-1       |            at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1203)
    sample-project-acs-1       |            at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1193)
    sample-project-acs-1       |            at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    sample-project-acs-1       |            at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
    sample-project-acs-1       |            at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
    sample-project-acs-1       |            at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:749)
    sample-project-acs-1       |            at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:203)
    sample-project-acs-1       |            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    sample-project-acs-1       |            at org.apache.catalina.core.StandardService.startInternal(StandardService.java:412)
    sample-project-acs-1       |            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    sample-project-acs-1       |            at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:870)
    sample-project-acs-1       |            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    sample-project-acs-1       |            at org.apache.catalina.startup.Catalina.start(Catalina.java:761)
    sample-project-acs-1       |            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sample-project-acs-1       |            at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    sample-project-acs-1       |            at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    sample-project-acs-1       |            at java.base/java.lang.reflect.Method.invoke(Method.java:569)
    sample-project-acs-1       |            at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
    sample-project-acs-1       |            at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:476)
  sample-project-acs-1       |    Caused by: org.apache.catalina.LifecycleException: Failed to process either the global, per-host or context-specific context.xml file therefore the [/alfresco] Context cannot be started.
    sample-project-acs-1       |            at org.apache.catalina.startup.FailedContext.startInternal(FailedContext.java:226)
    sample-project-acs-1       |            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:164)
    sample-project-acs-1       |            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:599)
    sample-project-acs-1       |            ... 37 more

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions