Java常见启动命令-jar、-server和-cp详细比较
Java程序常见启动方式
当前java程序启动主要以 -jar
、-server
、-cp
等几个命令启动 jar
程序,其中我们最常用的java -jar
启动方式,通常我们需要将当前工程所依赖的所有包编译到一个jar包中,随着工程不断迭代,外部依赖越来越多,会导致整个jar包体积变得很大,每次更新部署传输效率就会变得很低,这时我们就可以使用到另外两个命令来替代-jar
命令,将一部分或者全部依赖拆分,更新部署时只用更新部分依赖即可
java -jar
此命令不用多说,基本所有javaer都很熟悉,也很简单示例:基础用法
java -jar xxxxxx.jar
依赖拆分到外部的用法,使用java -jar
命令,同时需要将部分依赖包拆分到主启动程序jar包外部时,通常将jar包放置在主jar包相对目录下的一个单独的lib
文件中,如下图,lib为拆分后的外部依赖放置的目录
如上图,原jar包大小为110m,通过将部分依赖移出到外部之后,主启动程序jar包仅5.4m,这样便于开发迭代时缩小传输体量,提高效率,这时需要使用到启动参数-Dloader.path=lib
来加载主程序外部的依赖
java -Dloader.path=lib -jar xxxxxx-app.jar
java -server与-client参数
可以通过-server或-client设置jvm的运行参数。
它们的区别是Server VM的初始堆空间会大一些,默认使用的是并行垃圾回收器,启动慢运行快。Client VM相对来讲会保守一些,初始堆空间会小一些,使用串行的垃圾回收器,它的目标是为了让JVM的启动速度更快,但运行速度会比Serverm模式慢些。
JVM在启动的时候会根据硬件和操作系统自动选择使用Server还是Client类型的 JVM。
32位操作系统如果是Windows系统,不论硬件配置如何,都默认使用Client类型的JVM。
如果是其他操作系统上,机器配置有2GB以上的内存同时有2个以上CPU的话默认使用server模式,否则使用client模式。
64位操作系统只有server类型,不支持client类型。
-server
命令可以配合-jar
命令使用,也可单独使用
java -server -Xmx1024m -Xms256m -Xmn512m -Xss256k -Dloader.path=lib -jar xxxxxx-app.jar
-server
单独使用,配合-classpath
加载外部依赖
maven build构建插件,maven-assembly-plugin
,将所有jar构建到lib目录
<build> <plugins> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.6</version> <configuration> <appendAssemblyId>true</appendAssemblyId> <finalName>cas-service</finalName> <descriptors> <descriptor>src/main/assembly/package.xml</descriptor> </descriptors> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
package.xml
<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd"> <id>bin</id> <formats> <format>tar.gz</format> </formats> <dependencySets> <dependencySet> <outputDirectory>lib</outputDirectory> <scope>runtime</scope> </dependencySet> </dependencySets> <fileSets> <fileSet> <directory>src/main/bin</directory> <outputDirectory>/bin</outputDirectory> <fileMode>755</fileMode> </fileSet> <fileSet> <directory>src/main/resources</directory> <excludes> <exclude>**/mybatis-mapper/*</exclude> </excludes> <outputDirectory>/conf</outputDirectory> </fileSet> </fileSets> </assembly>
#!/bin/bash MAIN_CLASS=com.xxx.XXXApp source ~/.bash_profile export PROJECT_HOME="$( cd "$(dirname "$0")"/.. pwd )" APP_CLASS_PATH=.:$PROJECT_HOME/conf:$PROJECT_HOME/lib/* mkdir $PROJECT_HOME/logs 2>/dev/null (LD_LIBRARY_PATH=. java -server -Xmx256m -Xms256m -Xmn128m -Xss512k \ -classpath $APP_CLASS_PATH $MAIN_CLASS >/dev/null 2>&1 &)
java -cp
使用-cp
命令启动时,用法与-server
配合-classpath
使用时类似,不同的是不能与-jar
命令一起使用,使用-cp
命令时-jar
便会失效
#!/bin/bash MAIN_CLASS=com.xxx.XXXApp source ~/.bash_profile export PROJECT_HOME="$( cd "$(dirname "$0")"/.. pwd )" function init_app_class_path() { for file in $1/*; do if [ -z "$APP_CLASS_PATH" ]; then APP_CLASS_PATH=$file else APP_CLASS_PATH=$APP_CLASS_PATH:$file fi done } init_app_class_path $PROJECT_HOME/lib APP_CLASS_PATH=$PROJECT_HOME/conf:$APP_CLASS_PATH mkdir $PROJECT_HOME/logs 2>/dev/null (LD_LIBRARY_PATH=. java -Xmx512m -Xms256m -Xmn128m -Xss512k \ -cp $APP_CLASS_PATH $MAIN_CLASS >/dev/null 2>&1 &)
试了一下,-cp
扫描所有jar包及配置,直接使用*
也是可以匹配到的,如下这种方式也是有效的
java -cp /data/myapp/conf:/data/myapp/lib/* com.xxx.XXXApp
总结
到此这篇关于Java常见启动命令-jar、-server和-cp详细比较的文章就介绍到这了,更多相关Java启动命令-jar、-server和-cp内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Elasticsearch8.1中的Script使用实例深入解读
这篇文章主要为大家介绍了Elasticsearch8.1中的Script使用实例深入解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-10-10Java面试为何阿里强制要求不在foreach里执行删除操作
那天,小二去阿里面试,面试官老王一上来就甩给了他一道面试题:为什么阿里的 Java 开发手册里会强制不要在 foreach 里进行元素的删除操作2021-11-11
最新评论