Java常见启动命令-jar、-server和-cp详细比较

 更新时间:2023年07月31日 11:24:36   作者:chenzfp  
这篇文章主要给大家介绍了关于Java常见启动命令-jar、-server和-cp详细比较的相关资料,该文总结了常归的jar包的启动方式,并分析各种启动方式的区别,需要的朋友可以参考下

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中有界队列的饱和策略(reject policy)原理解析

    Java中有界队列的饱和策略(reject policy)原理解析

    这篇文章主要介绍了Java中有界队列的饱和策略(reject policy)原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • Java线程中synchronized的用法与原理解析

    Java线程中synchronized的用法与原理解析

    这篇文章主要介绍了Java线程中synchronized的用法与原理解析,只要有线程,就会有并发的现象,也同时会产生数据不一致,那么对于需要使用同一个数据的两个线程,就会产生冲突,那么就引出了锁的概念,本篇会针对性的说下synchronized这个关键字,需要的朋友可以参考下
    2024-01-01
  • springboot整合knife4j全过程

    springboot整合knife4j全过程

    这篇文章主要介绍了springboot整合knife4j全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java 读取zip文件的两种方式示例详解

    java 读取zip文件的两种方式示例详解

    ZIP(压缩文件)是一种常见的文件格式,在Java中可以使用java.util.zip包提供的API来读取和处理ZIP文件,本文将介绍如何使用Java读取ZIP文件,并提供代码示例,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Jmeter使用接口传递数据过程图解

    Jmeter使用接口传递数据过程图解

    这篇文章主要介绍了Jmeter使用接口传递数据过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Spring常用一些工具类实例汇总

    Spring常用一些工具类实例汇总

    这篇文章主要介绍了Spring常用一些工具类实例汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Spring Boot定时器创建及使用解析

    Spring Boot定时器创建及使用解析

    这篇文章主要介绍了Spring Boot定时器创建及使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 手写Java LockSupport的示例代码

    手写Java LockSupport的示例代码

    LockSupport给我们提供了一个非常强大的功能,它是线程阻塞最基本的元语,他可以将一个线程阻塞也可以将一个线程唤醒,因此经常在并发的场景下进行使用。本文将用60行代码实现手写LockSupport,需要的可以参考一下
    2022-08-08
  • 浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件

    浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及Spr

    这篇文章主要介绍了浅谈SpringMVC的拦截器(Interceptor)和Servlet 的过滤器(Filter)的区别与联系 及SpringMVC 的配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 一文了解为什么Java中只有值传递

    一文了解为什么Java中只有值传递

    Java 传参是值传递还是引用传递?这个问题很基础,但是许多人都有点懵。本文就来通过一些示例带大家详细了解一下,需要的可以参考一下
    2022-07-07

最新评论