java -cp与java -jar
java -cp(或java -classpath)
指定执行运行依赖jar和主类,需要绝对路径。指定多个jar时,linux用“:”分隔,windows“;”分隔。也可以用全称-classpath。支持通配符 “ * ”。java -cp classpath,-cp后面是类路径,解释器会到指定路径下查找class文件。
格式 java -cp .;myClass.jar packagename.mainclassname
例如
java -cp .;c:/classes/myClass.jar;d:/classes/*.jar packagename.mainclassname
java -cp D:\spark\spark-2.3.3\assembly\target\scala-2.11\jars\* org.apache.spark.deploy.master.Master
classpath中的jar文件可以使用通配符。
packagename.mainclassname为包含mian方法的完全限定类名,如果classpath中有多个具有main方法的类,通过-cp可以方便的选定程序的入口。
使用-jar选项,java.exe会忽略-cp、-classpath以及环境变量CLASSPATH的参数。
java -jar
指定运行的jar,会用到打包时的生成的META-INF下的MANIFEST.MF文件,其中Main-Class指定了主类。不能再指定其他依赖jar。ava -jar myClass.jar,执行该命令时,会用到目录META-INF\MANIFEST.MF文件,在该文件中,有一个叫Main-Class的参数,它说明了java -jar命令执行的类。
格式 java -jar myClass.jar
例如
java -jar myClass.jar
java -jar E:\workspace\idmapping\target\idmapping-1.0-SNAPSHOT.jar
指定main-class的两种方式
- Maven打包时在pom.xml的build中指定main-class
- 在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>packagename.mainclassname</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: packagename.mainclassname
用maven导出的包中,如果没有在pom文件中将依赖包打进去,是没有依赖包。
1.打包时指定了主类,可以直接用java -jar xxx.jar。
2.打包是没有指定主类,可以用java -cp xxx.jar 主类名称(绝对路径)。
3.要引用其他的jar包,可以用java -classpath $CLASSPATH:xxxx.jar 主类名称(绝对路径)。其中 -classpath 指定需要引入的类。
参考
- https://blog.csdn.net/zhuying_linux/article/details/7714194
- https://blog.csdn.net/sunny05296/article/details/78268464?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
- https://blog.csdn.net/lingeio/article/details/97012745
原文地址:https://www.cnblogs.com/hai-feng/p/12355235.html