java -cp & java jar的區別


java -cp

java -cp 和 -classpath 一樣,是指定類運行所依賴其他類的路徑,通常是類庫和jar包,需要全路徑到jar包,多個jar包之間連接符:window上分號“;”.Linux下使用“:”。
windows環境:

java -cp .;d:\work\other.jar;d:\work\my.jar packname.mainclassname 


linux環境:

java -cp .:/hone/myuser/work/other.jar:/hone/myuser/work/my.jar packname.mainclassname 

表達式支持通配符,例如:

java -cp .;c:\work\my.jar;c:\work\*.jar packname.mainclassname 
java -cp .:/home/myuser/work/lib/my.jar:/home/myuser/work/dependency_jars/*.jar packname.mainclassname 

java -jar

java -jar my.jar

執行該命令時,會用到目錄META-INF\MANIFEST.MF文件,在該文件中,有一個叫Main-Class的參數,它說明了java -jar命令執行的類。
java -jar方式不可以指定附加依賴jar包。

備注:
1.打包時指定了主類,可以直接用java -jar {xxx.jar}。
2.打包時沒有指定主類,可以用java -cp {xxx.jar} {主類名稱(絕對路徑)}。
3.要引用其他的jar包,可以用java -{[classpath|cp]} {$CLASSPATH}:{xxxx.jar} {主類名稱(絕對路徑)}。其中 -classpath 指定需要引入的類。

java -cp 和 -classpath 一樣,是指定類運行所依賴其他類的路徑,通常是類庫,jar包之類,需要全路徑到jar包,window上分號“;”
格式:
java -cp .;myClass.jar packname.mainclassname
表達式支持通配符,例如:
java -cp .;c:\classes01\myClass.jar;c:\classes02*.jar packname.mainclassname

java -jar myClass.jar
執行該命令時,會用到目錄META-INF\MANIFEST.MF文件,在該文件中,有一個叫Main-Class的參數,它說明了java -jar命令執行的類。

用maven導出的包中,如果沒有在pom文件中將依賴包打進去,是沒有依賴包。
1.打包時指定了主類,可以直接用java -jar xxx.jar。
2.打包是沒有指定主類,可以用java -cp xxx.jar 主類名稱(絕對路徑)。
3.要引用其他的jar包,可以用java -classpath $CLASSPATH:xxxx.jar 主類名稱(絕對路徑)。其中 -classpath 指定需要引入的類。

下面基於pom和META-INF\MANIFEST.MF兩個文件的配置,進行了三種情況的測試:
pom.xml的build配置:

  <build>
        <!--<finalName>test-1.0-SNAPSHOT</finalName>-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                        <mainClass>test.core.Core</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <!--下面是為了使用 mvn package命令,如果不加則使用mvn assembly-->
                <executions>
                    <execution>
                        <id>make-assemble</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

META-INF\MANIFEST.MF(清單文件)的內容:
Manifest-Version: 1.0
Main-Class: test.core.Core

1.pom中build指定mainClass 但是 META-INF\MANIFEST.MF文件中沒有指定Main-Class: test.core.Core
java -jar test-jar-with-dependencies.jar //執行成功
java -cp test-jar-with-dependencies.jar test.core.Core //執行失敗,提示jar中沒有主清單屬性

2.pom中build沒有指定mainClass 但是 META-INF\MANIFEST.MF文件中指定了Main-Class: test.core.Core
java -jar test-jar-with-dependencies.jar //執行失敗,提示jar中沒有主清單屬性
java -cp test-jar-with-dependencies.jar test.core.Core //執行成功

3.pom中build指定mainClass && META-INF\MANIFEST.MF文件中增加了Main-Class: test.core.Core
java -cp test-jar-with-dependencies.jar test.core.Core //執行成功
java -jar test-jar-with-dependencies.jar //執行成功

java -cp .;c:\dir1\lib.jar Test  
  
-cp 和 -classpath 一樣,是指定類運行所依賴其他類的路徑,通常是類庫,jar包之類,需要全路徑到jar包,window上分號“;”  
  
分隔,linux上是分號“:”分隔。不支持通配符,需要列出所有jar包,用一點“.”代表當前路徑。  
雖然現在都有eclipse之類的IDE了,但有時候后會手工編譯和運行一些程序,很多人包括多年開發經驗的人都不知道怎么在命令行參  
數運行類。有點杯具……  
使用范例:  
java -cp ..\lib\hsqldb.jar org.hsqldb.Server -database mydb   
或   
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM