• java命令行从编译到打jar包到执行


     目录:

    一. javac编译

        1. 没有额外的jar包

        2. 包含额外的jar包

    二、 jar打jar包

    三、 java运行

        1. java命令执行

        2. jar包执行

    四、 脚本完成编译执行

    整个过程模拟Eclipse的Java Project项目,包括src,以及生成的.class文件在bin中,还可能有lib,包含额外的jar包。

    一. javac编译

    1. 没有额外的jar包

    i)我们新建JavaProject,该项目结构如下:

    bin:必须新建一个空的bin文件,用于存放生成.class文件
    src:源码文件,包含我们写的.java文件
    
    src/com/zc/javaproject/test/HelloJava.java 
    src/com/zc/javaproject/test1/HelloWorld.java

    命令行运行:(在JavaProject目录下)

    # -d 指定.class的生成目录
    javac -d bin ./src/com/zc/javaproject/test/*.java ./src/com/zc/javaproject/test1/*.java
    
    # -classpath
    # 使用了-classpath,使得编译器在寻找HelloWorld类的时候以bin为根目录,根据根目录和package名,类名最终定位了需要用的(已编译出来的)HelloWorld类。
    javac -d bin -classpath bin ./src/com/zc/javaproject/test/*.java ./src/com/zc/javaproject/test1/*.java
    
    # -sourcepath 
    # 在编译条件里面加入-verbose可以很清楚的看到,编译器在寻找HelloWorld类的时候,以src为根目录,根据根目录和package名,类名最终定位了需要用的(源代码)HelloWorld类。
    javac -d bin -sourcepath src ./src/com/zc/javaproject/test/*.java ./src/com/zc/javaproject/test1/*.java
    
    # 
    javac -d bin -sourcepath src -classpath bin ./src/com/zc/javaproject/test/*.java ./src/com/zc/javaproject/test1/*.java

    结果:bin中生成和src目录相对应的.class文件,类似eclipse中的bin。

    bin/com/zc/javaproject/test/HelloJava.class
    bin/com/zc/javaproject/test1/HelloWorld.class

    ii)我们新建JavaProject,该项目结构如下:

    
    
    假设你的这个包放在src文件夹下,src的父目录为JavaProject,sourcelist.txt也事先新建在JavaProject文件夹下。首先将这个包中你需要编译的java文件相对于src的路径注册到sourcelist.txt文件中;接着在project文件夹中新建一个bin文件夹
    bin:必须新建一个空的bin文件,用于存放生成.class文件
    src:源码文件,包含我们写的.java文件
    sourcelist.txt:编译单位其实就是单个的java文件,为了达到同时编译多个java文件的目的,可以将所需编译的java文件路径保存在一个txt中,比如sourcelist.txt,以换行为分隔符(这个过程称为类文件注册)。
    src
    /com/zc/javaproject/test/HelloJava.java src/com/zc/javaproject/test1/HelloWorld.java

     sourcelist.txt内容如下:(必须指定具体的java)

    ./src/com/zc/javaproject/test/HelloJava.java
    ./src/com/zc/javaproject/test1/HelloWorld.java

    命令行运行:(在JavaProject目录下)

    javac -d bin -sourcepath src -classpath bin @sourcelist.txt

    结果:bin中生成和src目录相对应的.class文件,类似eclipse中的bin。

    bin/com/zc/javaproject/test/HelloJava.class
    bin/com/zc/javaproject/test1/HelloWorld.class

    2. 包含额外的jar包

     我们新建Class2Json,该项目结构如下:

    假设你的这个包放在src文件夹下,src的父目录为Class2Json,sourcelist.txt也事先新建在Class2Json文件夹下。首先将这个包中你需要编译的java文件相对于src的路径注册到sourcelist.txt文件中;接着在project文件夹中新建一个bin文件夹
    bin:必须新建一个空的bin文件,用于存放生成.class文件
    lib:包含需要的额外的jar包
    src:源码文件,包含我们写的.java文件
    sourcelist.txt:编译单位其实就是单个的java文件,为了达到同时编译多个java文件的目的,可以将所需编译的java文件路径保存在一个txt中,比如sourcelist.txt,以换行为分隔符(这个过程称为类文件注册)。
    
    src/com/zc/class2json/trans/main/DataClass2Json.java 
    src/com/zc/class2json/trans/test/TestDataClass2Json.java src
    /com/zc/dataclass/main/PersonData.java

    lib中jar包:

    sourcelist.txt内容如下:(必须指定具体的java)

    ./src/com/zc/class2json/trans/main/DataClass2Json.java 
    ./src/com/zc/class2json/trans/test/TestDataClass2Json.java
    ./src/com/zc/dataclass/main/PersonData.java

    命令行运行:(在Class2Json文件下)   linux下用冒号:分隔开,Windows下用分号;隔开。参考 https://blog.csdn.net/myfmyfmyfmyf/article/details/53179395

    javac -d bin -sourcepath src -classpath .:lib/commons-beanutils-1.8.0.jar:lib/commons-collections-3.2.1.jar:lib/commons-lang-2.4.jar:lib/commons-logging-1.1.3.jar:lib/ezmorph-1.0.6.jar:lib/json-lib-2.3-jdk15.jar @sourcelist.txt
    javac -d bin -sourcepath src -classpath .:bin:lib/commons-beanutils-1.8.0.jar:lib/commons-collections-3.2.1.jar:lib/commons-lang-2.4.jar:lib/commons-logging-1.1.3.jar:lib/ezmorph-1.0.6.jar:lib/json-lib-2.3-jdk15.jar @sourcelist.txt
    或者
    lib=.:bin:lib/commons-beanutils-1.8.0.jar:lib/commons-collections-3.2.1.jar:lib/commons-lang-2.4.jar:lib/commons-logging-1.1.3.jar:lib/ezmorph-1.0.6.jar:lib/json-lib-2.3-jdk15.jar
    javac -d bin -sourcepath src -classpath $lib @sourcelist.txt

    结果:bin中生成和src目录相对应的.class文件,类似eclipse中的bin。

    ./bin/com/zc/class2json/trans/main/DataClass2Json.class
    ./bin/com/zc/class2json/trans/test/TestDataClass2Json.class
    ./bin/com/zc/dataclass/main/PersonData.class

    二、 jar打jar包

    参考我的博客 jar命令打jar包

    三、 java运行

    1. java命令执行

    1)对于 JavaProject项目

    对于第一个不含jar包的项目,在JavaProject目录下:

    // java -cp/-classpath 相对/绝对路径 类
    java -cp bin com.zc.javaproject.test.HelloJava java -classpath bin com.zc.javaproject.test.HelloJava
    java -cp bin com/zc/javaproject/test/HelloJava
    java -classpath bin com/zc/javaproject/test/HelloJava

    执行结果如下:

    2)对与Class2Json项目

    对于含jar包的项目,在Class2Json目录下: 使用java命令的-classpath或-cp选项,或设置CLASSPATH 

    java -cp .:bin:lib/commons-beanutils-1.8.0.jar:lib/commons-collections-3.2.1.jar:lib/commons-lang-2.4.jar:lib/commons-logging-1.1.3.jar:lib/ezmorph-1.0.6.jar:lib/json-lib-2.3-jdk15.jar com.zc.class2json.trans.test.TestDataClass2Json
    java -cp .:bin:lib/commons-beanutils-1.8.0.jar:lib/commons-collections-3.2.1.jar:lib/commons-lang-2.4.jar:lib/commons-logging-1.1.3.jar:lib/ezmorph-1.0.6.jar:lib/json-lib-2.3-jdk15.jar com/zc/class2json/trans/test/TestDataClass2Json
    或者
    lib=.:bin:lib/commons-beanutils-1.8.0.jar:lib/commons-collections-3.2.1.jar:lib/commons-lang-2.4.jar:lib/commons-logging-1.1.3.jar:lib/ezmorph-1.0.6.jar:lib/json-lib-2.3-jdk15.jar
    java -cp $lib com.zc.class2json.trans.test.TestDataClass2Json

    执行结果如下:

    2. jar包执行

     因为META-INF/MANIFEST.MF指明了jar包以及主类:

    java -jar Class2Json.jar

    四、 脚本完成编译执行

    在Class2Json目录下:

    bin:空的
    lib:需要额外的jar包
    src:源码
    class2json.sh:执行脚本
    sourcelist.txt:

    sourcelist.txt内容如下:(必须指定具体的java)

    ./src/com/zc/class2json/trans/main/DataClass2Json.java 
    ./src/com/zc/class2json/trans/test/TestDataClass2Json.java
    ./src/com/zc/dataclass/main/PersonData.java

    创建class2json.sh,内容如下:

    #!/bin/bash
    #设置临时变量
    lib=.:bin:lib/commons-beanutils-1.8.0.jar:lib/commons-collections-3.2.1.jar:lib/commons-lang-2.4.jar:lib/commons-logging-1.1.3.jar:lib/ezmorph-1.0.6.jar:lib/json-lib-2.3-jdk15.jar
    #编译
    javac -encoding UTF-8 -d bin -sourcepath src -classpath $lib @sourcelist.txt
    #运行
    java -cp $lib com.zc.class2json.trans.test.TestDataClass2Json

    运行: 

    bash class2json.sh
    或者sh class2json.sh
    或者 
    chmod +x  class2json.sh
    ./class2json.sh

    结果:

  • 相关阅读:
    点击其他地方隐藏div
    jquery获得被选中radio的值
    c++几个新特性
    effective c++ (三)
    80X86保护模式及其编程(一)
    Linux内核完全注释之编程语言和环境(二)
    Linux内核完全注释之编程语言和环境(一)
    linux内核完全注释之微型计算机组成结构
    effective c++ (二)
    effective c++ (一)
  • 原文地址:https://www.cnblogs.com/zhangchao0515/p/9535248.html
Copyright © 2020-2023  润新知