启动 springboot jar包时指定额外的classpath (-Xbootclasspath/a:)

发布时间 2023-06-02 08:22:48作者: zno2

https://www.cnblogs.com/zno2/p/16353014.html

借助 java -jar -Xbootclasspath/a:D:\conf testcp.jar

 

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class FooApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(FooApplication.class, args);
        
        RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
        grid(runtimeMXBean);
        
        try {
            Properties properties = new Properties();
            properties.load(FooApplication.class.getClassLoader().getResourceAsStream("sdk.properties"));
            grid(properties);
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    public static void grid(RuntimeMXBean runtimeMXBean) {
        List<KV> list = new ArrayList<>();
        list.add(new KV("name",runtimeMXBean.getName()));
        list.add(new KV("vmName",runtimeMXBean.getVmName()));
        list.add(new KV("vmVendor",runtimeMXBean.getVmVendor()));
        list.add(new KV("vmVersion",runtimeMXBean.getVmVersion()));
        list.add(new KV("specName",runtimeMXBean.getSpecName()));
        list.add(new KV("specVendor",runtimeMXBean.getSpecVendor()));
        list.add(new KV("managementSpecVersion",runtimeMXBean.getManagementSpecVersion()));
        list.add(new KV("inputArguments",runtimeMXBean.getInputArguments().toString()));
        list.add(new KV("uptime",runtimeMXBean.getUptime()+""));
        list.add(new KV("startTime",runtimeMXBean.getStartTime()+""));
        grid(list);
        
        grid("bootClassPath", runtimeMXBean.getBootClassPath());
        grid("classPath", runtimeMXBean.getClassPath());
        grid("libraryPath", runtimeMXBean.getLibraryPath());
    }
    
    public static void grid(String k, String vs) {
        List<KV> list = new ArrayList<>();
        String[] splits = vs.split(";");
        for (String split : splits) {
            list.add(new KV(k,split));
        }
        grid(list);
    }
    
    public static void grid(Properties properties) {
        List<KV> list = new ArrayList<>();
        properties.forEach((k,v)->{
            list.add(new KV(k.toString(), v.toString()));
        });
        grid(list);
    }
    
    public static void grid(List<KV> list) {
        int aLen = 0;
        int bLen = 0;
        
        for (KV kv : list) {
            String k = kv.getK();
            String v = kv.getV();
            if(k.length() > aLen) {
                aLen = k.length();
            }
            if(v.length() > bLen) {
                bLen = v.length();
            }
        }
        
        System.out.println("|" + padding("",1+aLen+1+1+bLen, '-') + "|");
        for (KV kv : list) {
            String k = kv.getK();
            String v = kv.getV();
            System.out.println("| " + padding(k,aLen,' ') + "| " + padding(v,bLen,' ') + "|");
        }
        System.out.println("|" + padding("",1+aLen+1+1+bLen, '-') + "|");
        
    }

    public static String padding(String s, int length, char c) {
        String r = s;
        for(int i=0;i<length-s.length();i++) {
            r += c;
        }
        return r;
    }
    
    public static class KV {
        private String k;
        private String v;
        public KV(String k, String v) {
            this.k = k;
            this.v = v;
        }
        public String getK() {
            return k;
        }
        public void setK(String k) {
            this.k = k;
        }
        public String getV() {
            return v;
        }
        public void setV(String v) {
            this.v = v;
        }
        
    }
}

 

上面是springboot 项目,打jar包后测试如下:

首先创建目录D://conf

目录中添加 sdk.properties

上面代码会尝试在classpath中加载上面的文件

 java -jar  testcp.jar 

 

|----------------------------------------------------------|
| name                 | 22108@DESKTOP-5KL2IOV             |
| vmName               | Java HotSpot(TM) 64-Bit Server VM |
| vmVendor             | Oracle Corporation                |
| vmVersion            | 25.181-b13                        |
| specName             | Java Virtual Machine Specification|
| specVendor           | Oracle Corporation                |
| managementSpecVersion| 1.2                               |
| inputArguments       | []                                |
| uptime               | 1495                              |
| startTime            | 1666347906908                     |
|----------------------------------------------------------|
|-------------------------------------------------------------|
| bootClassPath| D:\Program Files\java\jre8\lib\resources.jar |
| bootClassPath| D:\Program Files\java\jre8\lib\rt.jar        |
| bootClassPath| D:\Program Files\java\jre8\lib\sunrsasign.jar|
| bootClassPath| D:\Program Files\java\jre8\lib\jsse.jar      |
| bootClassPath| D:\Program Files\java\jre8\lib\jce.jar       |
| bootClassPath| D:\Program Files\java\jre8\lib\charsets.jar  |
| bootClassPath| D:\Program Files\java\jre8\lib\jfr.jar       |
| bootClassPath| D:\Program Files\java\jre8\classes           |
|-------------------------------------------------------------|
|----------------------|
| classPath| testcp.jar|
|----------------------|
|--------------------------------------------------------------------------------------|
| libraryPath| C:\Program Files (x86)\Common Files\Oracle\Java\javapath                |
| libraryPath| C:\WINDOWS\Sun\Java\bin                                                 |
| libraryPath| C:\WINDOWS\system32                                                     |
| libraryPath| C:\WINDOWS                                                              |
| libraryPath| C:\Program Files (x86)\Common Files\Oracle\Java\javapath                |
| libraryPath| C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\iCLS\|
| libraryPath| C:\Program Files\Intel\Intel(R) Management Engine Components\iCLS\      |
| libraryPath| C:\Windows\system32                                                     |
| libraryPath| C:\Windows                                                              |
| libraryPath| C:\Windows\System32\Wbem                                                |
| libraryPath| C:\Windows\System32\WindowsPowerShell\v1.0\                             |
| libraryPath| C:\Windows\System32\OpenSSH\                                            |
| libraryPath| C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL  |
| libraryPath| C:\Program Files\Intel\Intel(R) Management Engine Components\DAL        |
| libraryPath| C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT  |
| libraryPath| C:\Program Files\Intel\Intel(R) Management Engine Components\IPT        |
| libraryPath| C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common                  |
| libraryPath| C:\WINDOWS\system32                                                     |
| libraryPath| C:\WINDOWS                                                              |
| libraryPath| C:\WINDOWS\System32\Wbem                                                |
| libraryPath| C:\WINDOWS\System32\WindowsPowerShell\v1.0\                             |
| libraryPath| C:\WINDOWS\System32\OpenSSH\                                            |
| libraryPath| D:\e\Java\openjdk1.8.0_181\bin                                          |
| libraryPath| D:\e\maven\apache-maven-3.6.0\bin                                       |
| libraryPath| D:\Program Files\TortoiseGit\bin                                        |
| libraryPath| D:\Program Files\Git\cmd                                                |
| libraryPath| D:\Program Files\TortoiseSVN\bin                                        |
| libraryPath| D:\e\nodejs\node-v14.3.0-win-x86                                        |
| libraryPath| C:\Program Files (x86)\PuTTY\                                           |
| libraryPath| C:\Users\witas\AppData\Local\Microsoft\WindowsApps                      |
| libraryPath| D:\Program Files\OpenSSL-Win64\bin                                      |
| libraryPath|                                                                         |
| libraryPath| .                                                                       |
|--------------------------------------------------------------------------------------|
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: java.lang.NullPointerException
        at java.util.Properties$LineReader.readLine(Unknown Source)
        at java.util.Properties.load0(Unknown Source)
        at java.util.Properties.load(Unknown Source)
        at cn.xs.testcp.FooApplication.main(FooApplication.java:24)
        ... 8 more

 

 java -jar -Xbootclasspath/a:D:\conf testcp.jar 

 

 

小结:可以通过 -Xbootclasspath/a:<这里是你的目录> 来指定额外的classpath