{"record":{"id":"801c36a6d0416e07","repo":"alibaba/arthas","slug":"can-not-find-tools-jar-under-java-home-javahome","errorCode":null,"errorMessage":"Can not find tools.jar under java home: {javaHome}, please try to start arthas-boot with full path java. Such as /opt/jdk/bin/java -jar arthas-boot.jar","messagePattern":"Can not find tools\\.jar under java home: (.+?), please try to start arthas-boot with full path java\\. Such as /opt/jdk/bin/java -jar arthas-boot\\.jar","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java","lineNumber":269,"sourceCode":"                AnsiLog.debug(\"Can not find tools.jar under java.home: \" + javaHome);\n                String javaHomeEnv = System.getenv(\"JAVA_HOME\");\n                if (javaHomeEnv != null && !javaHomeEnv.isEmpty()) {\n                    AnsiLog.debug(\"Try to find tools.jar in System Env JAVA_HOME: \" + javaHomeEnv);\n                    // $JAVA_HOME/lib/tools.jar\n                    toolsJar = new File(javaHomeEnv, \"lib/tools.jar\");\n                    if (!toolsJar.exists()) {\n                        // maybe jre\n                        toolsJar = new File(javaHomeEnv, \"../lib/tools.jar\");\n                    }\n                }\n\n                if (toolsJar.exists()) {\n                    AnsiLog.info(\"Found java home from System Env JAVA_HOME: \" + javaHomeEnv);\n                    FOUND_JAVA_HOME = javaHomeEnv;\n                    return FOUND_JAVA_HOME;\n                }\n\n                throw new IllegalArgumentException(\"Can not find tools.jar under java home: \" + javaHome\n                        + \", please try to start arthas-boot with full path java. Such as /opt/jdk/bin/java -jar arthas-boot.jar\");\n            }\n        } else {\n            FOUND_JAVA_HOME = javaHome;\n        }\n        return FOUND_JAVA_HOME;\n    }\n\n    public static void startArthasCore(long targetPid, List<String> attachArgs) {\n        // find java/java.exe, then try to find tools.jar\n        String javaHome = findJavaHome();\n\n        // find java/java.exe\n        File javaPath = findJava(javaHome);\n        if (javaPath == null) {\n            throw new IllegalArgumentException(\n                    \"Can not find java/java.exe executable file under java home: \" + javaHome);\n        }","sourceCodeStart":251,"sourceCodeEnd":287,"githubUrl":"https://github.com/alibaba/arthas/blob/21cf2e9ba52b305290be7223b980ff504bb9cb5b/boot/src/main/java/com/taobao/arthas/boot/ProcessUtils.java#L251-L287","documentation":"ProcessUtils.findJavaHome (the JAVA_HOME-env branch, ~line 269) searches for tools.jar relative to the JAVA_HOME environment variable. If neither $JAVA_HOME/lib/tools.jar nor $JAVA_HOME/../lib/tools.jar exists, it throws IllegalArgumentException instructing the user to start arthas-boot with a full JDK java path. This branch matters only for JDK 8 and earlier where tools.jar is required.","triggerScenarios":"Running on Java <= 8 with JAVA_HOME pointing at a JRE (not a JDK), or JAVA_HOME unset/misconfigured so that tools.jar cannot be located relative to it.","commonSituations":"Container image ships a JRE only; JAVA_HOME points at /usr/lib/jvm/.../jre instead of the JDK root; system 'java' is a JRE stub; downstream of a version-detection path that picked the wrong home.","solutions":["Install a full JDK (not JRE) and set JAVA_HOME to the JDK root.","Start arthas-boot with an explicit full JDK path: /opt/jdk/bin/java -jar arthas-boot.jar.","Verify tools.jar exists at $JAVA_HOME/lib/tools.jar.","On Java 9+ tools.jar no longer exists — ensure you are not forcing an older detection path."],"exampleFix":"# before\nexport JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre   # JRE: no tools.jar\njava -jar arthas-boot.jar\n\n# after\nexport JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64       # JDK root\n/opt/jdk/bin/java -jar arthas-boot.jar","handlingStrategy":"validation","validationCode":"String jh = System.getenv(\"JAVA_HOME\");\nFile tools = new File(jh, \"lib/tools.jar\");\nif (!tools.isFile() && !new File(jh, \"../lib/tools.jar\").isFile()) {\n    throw new IllegalStateException(\"JAVA_HOME lacks tools.jar; use a full JDK\");\n}","typeGuard":"static boolean hasToolsJar(String javaHome) {\n    if (javaHome == null) return false;\n    return new File(javaHome, \"lib/tools.jar\").isFile()\n        || new File(javaHome, \"../lib/tools.jar\").isFile();\n}","tryCatchPattern":"try {\n    ProcessUtils.findJavaHome();\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"tools.jar\")) {\n        // switch JAVA_HOME to a JDK, or use full-path java\n    } else throw e;\n}","preventionTips":["Install a full JDK (not JRE) for Java <= 8 work.","Set JAVA_HOME to the JDK root and verify lib/tools.jar exists.","Launch with /opt/jdk/bin/java -jar arthas-boot.jar when in doubt."],"tags":["boot","jdk","java-home","environment","java8"],"backgroundTag":null,"analyzedSha":"21cf2e9ba52b305290be7223b980ff504bb9cb5b","analyzedAt":"2026-08-14T00:57:07.243Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}