天天看點

可執行 jar | 到底如何執行

dog
│   pom.xml
│
└───src
    └───main
        └───java
            └───cn
                └───zno
                        Dog.java      
bark
│   pom.xml
│
└───src
    └───main
        └───java
            └───cn
                └───zno
                        Main.java      
package cn.zno;

public class Main {

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.bark(args[0]);

    }

}      
package cn.zno;

public class Dog {

    public void bark(String str) {
        System.out.println(str);
    }

}      

dog.jar

bark.jar

F:\>java -cp F:\e\dog.jar;F:\e\bark.jar; cn.zno.Main wang~wang~
wang~wang~      

ps:When you use the 

-jar

 option, the specified JAR file is the source of all user classes, and other class path settings are ignored.

意思是:如果用-jar指令執行可執行jar包,那麼-cp 将失效

目前采用:執行類的main函數的方式

ps:Note that the -cp parameter must contain only JAR files;

意思是:-cp 不能通過指定檔案夾來發現jar,必須通過枚舉全部的jar。window ; 分隔 linux : 分隔

方式二:通過 

JAR Manifest

指定 Class-Path

可執行 jar | 到底如何執行
Manifest-Version: 1.0
Main-Class: cn.zno.Main
Class-Path: app-a-1.0.jar app-b-1.0.jar      

補充:具體如何使用 -cp 或 -classpath

https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/jrdocs/refman/intro.html

-cp or -classpath

Specifies a list of directories, JAR archives, and ZIP archives to search for class files. Class path entries are separated by semicolons (;) in Windows or colons (:) in Linux. Specifying 

-classpath

 or 

-cp

 overrides any setting of the 

CLASSPATH

 environment variable.

1)方式一:通過設定 CLASSPATH 環境變量

① 設定系統環境變量

② 設定臨時環境變量

2)方式二:通過 -cp 或 -classpath 指定,此優先級高于環境變量

非jar包測試

1)預設從目前檔案夾找類

D:\test1>javac Test.java

D:\test1>java Test
Hello!      

2)如果沒有環境變量也沒有指定classpath 目前目錄也沒有類就會失敗

D:\test1>cd ../test2

D:\test2>java Test
錯誤: 找不到或無法加載主類 Test      

3)可以通過設定環境變量CLASSPATH=xxx(等号左右沒空格)

D:\test2>set CLASSPATH=D:\test1

D:\test2>java Test
Hello!      

4)可以覆寫或拼接CLASSPATH

D:\test2>set CLASSPATH=D:\test2

D:\test2>java Test
錯誤: 找不到或無法加載主類 Test

D:\test2>set CLASSPATH=%CLASSPATH%;D:\test1

D:\test2>echo %CLASSPATH%
D:\test2;D:\tset1;D:\test1

D:\test2>java Test
Hello!      

5)-cp 或 -classpath 的優先級要高于環境變量

D:\test2>java -cp D:\test1 Test
Hello!

D:\test2>echo %CLASSPATH%
D:\test2

D:\test2>set CLASSPATH=D:\test1

D:\test2>java Test
Hello!

D:\test2>java -cp D:\test2 Test
錯誤: 找不到或無法加載主類 Test      

jar包測試

1)沒有設定環境變量,沒有使用-classpath,但是也不能從目前檔案夾中的jar包中找到目标類

D:\test>dir /B
bark.jar
dog.jar

D:\test>java Test
錯誤: 找不到或無法加載主類 Test      

2)jar 隻能指定為具體的路徑,如果有10個,那需要把10個全部設定到classpath裡

D:\test>java -cp D:\test\bark.jar;D:\test\dog.jar Test
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name config/bark, locale zh_CN
        at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1564)
        at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1387)
        at java.util.ResourceBundle.getBundle(ResourceBundle.java:773)
        at Test.main(Test.java:8)      

注:

轉載于:https://www.cnblogs.com/zno2/p/5833455.html