How to determine main class at runtime in threaded java application?

后端 未结 10 992
野的像风
野的像风 2021-01-01 13:37

I want to determine the class name where my application started, the one with the main() method, at runtime, but I\'m in another thread and my stacktrace doesn\'t go all the

10条回答
  •  情歌与酒
    2021-01-01 14:18

    Even if the thread with the main() method has terminated and you are not using the Oracle JVM you can still attempt to get the information from the operating system. The code below obtains the command line used to start the JVM under Linux but you could write a version for Windows, etc. You could then look at the arguments to the JVM to find the application entry point. It might be directly on the command line or you might have look for Main-Class: classname in the manifest of the specified jar. I would first use System.getProperty("sun.java.command") and friends only falling back to this mechanism if necessary.

    public final static long getSelfPid() {
        // Java 9 only
        // return ProcessHandle.current().getPid();
        try {
            return Long.parseLong(new File("/proc/self").getCanonicalFile().getName());
        } catch( Exception e ) {
            return -1;
        }
    }
    
    public final static String getJVMCommandLine() {
        try {
            // Java 9 only
            // long pid = ProcessHandle.current().getPid();
            long pid = getSelfPid();
            byte[] encoded = Files.readAllBytes(Paths.get("/proc/"+pid+"/cmdline"));
            // assume ISO_8859_1, but could look in /proc//environ for LANG or something I suppose
            String commandLine = new String( encoded, StandardCharsets.ISO_8859_1 ); 
            String modifiedCommandLine = commandLine.replace((char)0, ' ').trim();
            return modifiedCommandLine;
        } catch( Exception e ) {
            return null;
        }
    }`
    

提交回复
热议问题