zoukankan      html  css  js  c++  java
  • sh脚本执行Java程序

    1、不引用Jar包或者资源文件夹

    最简单的程序Hello World。

    首先创建Hello.java 

    [java] view plain copy
     
     print?
    1. public class Hello {  
    2.   
    3.     public static void main(String[] args) {          
    4.         System.out.println("Hello World");  
    5.   
    6.     }  
    7.   
    8. }  

    编译生成Hello.class文件。下面写用sh脚本执行Hello

    将以上生成的Hello.class文件拷贝至主文件夹,然后新建一个脚本文件ex.sh

    [plain] view plain copy
     
     print?
    1. #!/bin/bash  
    2. cd /home/xyw/  
    3. /usr/lib/jvm/jdk1.7.0_21/bin/java Hello  

    说明:

    cd /home/xyw/ 定位到Hello.class 文件所在的目录

    /usr/lib/jvm/jdk1.7.0_21 是jdk的安装目录

    Hello 是要执行的java程序

    保存,对ex.sh 添加执行权限

    [plain] view plain copy
     
     print?
    1. chmod 777 ex.sh  

    执行ex.sh

    [plain] view plain copy
     
     print?
    1. ./ex.sh  

    打印出Hello World

    2、引用jar包或资源文件夹

    在用java编写数据库程序时,往往会引用数据引擎的jar包,例如Mysql数据库,需要mysql-connector-java-5.1.24-bin.jar或者你编写的程序中不仅仅包含src源码文件,还有资源文件夹,下面总结如何在脚本文件中包含这些需要引用的文件。

    新建一个java文件:Test.java

    [java] view plain copy
     
     print?
    1. import java.sql.Connection;  
    2. import java.sql.DriverManager;  
    3. import java.sql.ResultSet;  
    4. import java.sql.Statement;  
    5.   
    6.   
    7. public class Test {  
    8.   
    9.     public static final String DBDRIVER = "org.gjt.mm.mysql.Driver";  
    10.     public static final String DBURL = "jdbc:mysql://127.0.0.1:3306/test";  
    11.     public static final String DBUSER = "root";  
    12.     public static final String DBPASS = "1234";  
    13.           
    14.       
    15.     public static void main(String[] args) throws Exception {  
    16.         Connection conn = null;  
    17.         Statement stat = null;  
    18.         ResultSet rs = null;  
    19.           
    20.         Class.forName(DBDRIVER);  
    21.         String sql = "SELECT * FROM keyword";  
    22.         conn = DriverManager.getConnection(DBURL, DBUSER, DBPASS);  
    23.         stat = conn.createStatement();  
    24.         rs = stat.executeQuery(sql);  
    25.         while(rs.next())  
    26.         {  
    27.             System.out.println(rs.getInt(1) + ": " + rs.getString(2));  
    28.         }  
    29.   
    30.     }  
    31.   
    32. }  

    这是一个基本的调用mysql数据的程序。编译,生成Test.class

    将Test.class 文件置于:/home/xyw/任务/xx  文件夹下。

    方法(1)

    将mysql-connector-java-5.1.24-bin.jar包解压,将解压得到的com org 文件夹一起拷贝到/home/xyw/任务/xx  文件夹下,使Test.class 和com org 处在同一个目录中。编写脚本:

    [plain] view plain copy
     
     print?
    1. #!/bin/bash  
    2. cd /home/xyw/任务/xx  
    3. /usr/lib/jvm/jdk1.7.0_21/bin/java Test    

    同样保存,添加执行权限,运行,得到查询结果。

    方法(2):推荐使用

    不解压mysql-connector-java-5.1.24-bin.jar,使用java -cp 命令指定文件类搜索路径

    [plain] view plain copy
     
     print?
    1. #!/bin/bash  
    2. cd /home/xyw/任务/xx  
    3. /usr/lib/jvm/jdk1.7.0_21/bin/java  -cp .:./mysql-connector-java-5.1.24-bin.jar Test  

    当前目录xx下有:Test.class 、mysql-connector-java-5.1.24-bin.jar
    java 的cp命令功能如下:(cp和class path功能相同)

    -cp <目录和 zip/jar 文件的类搜索路径>

    -classpath <目录和 zip/jar 文件的类搜索路径>
                      用 : 分隔的目录, JAR 档案 和 ZIP 档案列表, 用于搜索类文件。

    多个目录或者文件之间用冒号:分割。下面解析/usr/lib/jvm/jdk1.7.0_21/bin/java  -cp .:./mysql-connector-java-5.1.24-bin.jar Test 这句命令的含义

    同样,/usr/lib/jvm/jdk1.7.0_21 指出jdk的安装目录。-cp后面的第一个. 表示当前目录,目的是在当前目录下查找类Test,如果没有这个. 会报错:"错误: 找不到或无法加载主类 Test"。中间的冒号起到间隔作用。./是在当前目录下的子目录,即在mysql-connector-java-5.1.24-bin.jar文件中搜索。最后是要执行的Test类。

    我犯了一个错误,将Test放在-cp之前了,所以导致mysql-connector-java-5.1.24-bin.jar根本没有被搜索,一直不成功。所以切记:-cp 命令是直接跟在java 之后。

    方法(3):推荐使用

    将源码文件制作成jar包,将该jar包和需要引用的资源文件jar包放置在相同或者不同目录下(即下文制作jar包中:2引用jar包-方法(2)),在sh脚本命令中,执行制作的jar包。

    setp1:制作jar包。见下文2、引用jar包之方法(2)

    step2:将制作的jar包Test.jar 和引用的jar包mysql-connector-java-5.1.24-bin.jar放置在同一个目录下,假设为:/home/xyw

    setp3:写脚本命令:

    [plain] view plain copy
     
     print?
    1. !#/bin/bash  
    2. cd /home/xyw  
    3. /usr/lib/jvm/jdk1.7.0_21/bin/java -jar Test.jar  

    分析:java命令会执行Test.jar 包,首先会找到jar包中Manifest文件,确定Main-Class指定的要执行的主方法,再根据Class-Path 指定的资源路径寻找运行需要的资源包,执行Test方法。
    下面就具体介绍一下如何制作jar包。

    拓展:制作可执行的jar包

    1、不引用jar包以及资源文件

    还是以第一个Hello.class 为例。Hello.class存在于目录:/home/xyw/任务/xx 内

    将Hello.class制成可执行的jar文件。

    step1:制作jar文件

    [plain] view plain copy
     
     print?
    1. jar cvf Hello.jar Hello.class  

    setp2:修改MANIFEST.MF文件

    打开MANIFEST.MF文件,你看到的是:

    [plain] view plain copy
     
     print?
    1. Manifest-Version: 1.0  
    2. Created-By: 1.7.0_21 (Oracle Corporation)  

    添加包含main方法的类:Main-Class: Test

    即:

    [plain] view plain copy
     
     print?
    1. Manifest-Version: 1.0  
    2. Created-By: 1.7.0_21 (Oracle Corporation)  
    3. Main-Class: Test  

    注意:Main-Class冒号后面一定要有一个空格,然后再写类名称

    保存,更新一下jar包,执行jar包

    [plain] view plain copy
     
     print?
    1. java -jar Hello.jar  

    输出:Hello World
    2、引用jar包

    以Test.class 文件为例。Test.class 文件存在于目录:/home/xyw/任务/xx 内

    因为Test.class 依赖于mysql-connector-java-5.1.24-bin.jar包,更具体一点,是依赖与这个包中的com文件夹和org文件夹

    方法(1):

    只将com和org文件夹和Test.class添加到可执行的jar包中。

    setp1:将mysql-connector-java-5.1.24-bin.jar解压缩,将得到的com和org文件夹放到/home/xyw/任务/xx 目录下。

    当前/home/xyw/任务/xx 目录下文件(夹)包括:Test.class 、com、org

    setp2:制作jar包

    [plain] view plain copy
     
     print?
    1. jar cvf Test.jar Test.class com/ org/  

    得到一个包含:Test.class 、META-INF、com、org 的jar包

    step3:修改MANIFEST.MF文件

    [plain] view plain copy
     
     print?
    1. Manifest-Version: 1.0  
    2. Created-By: 1.7.0_21 (Oracle Corporation)  
    3. Main-Class: Test  

    保存,更新jar包,执行

    [plain] view plain copy
     
     print?
    1. java -jar Test.jar  

    方法(2):推荐方法
    在方法1中,我们把com和org文件都从mysql-connector-java-5.1.24-bin.jar添加到了jar包中,也可以将mysql-connector-java-5.1.24-bin.jar单独存放,但是得在MANIFEST.MF文件中添加mysql-connector-java-5.1.24-bin.jar的路径。

    setp1:将mysql-connector-java-5.1.24-bin.jar和Test.class 放置于相同的目录下,假设为/home/xyw/任务/xx。

    step2:将Test.class添加到jar包

    [plain] view plain copy
     
     print?
    1. jar cvf Test.jar Test.class   

    step3:修改MANIFEST.MF文件

    [plain] view plain copy
     
     print?
    1. Manifest-Version: 1.0  
    2. Created-By: 1.7.0_21 (Oracle Corporation)  
    3. Main-Class: Test  
    4. Class-Path: ./mysql-connector-java-5.1.24-bin.jar  

    说明:Class-Path:是执行这个jar包的Main-Class对应的类时,类包的搜索路径。.表示当前jar所在的路径。./mysql-connector-java-5.1.24-bin.jar表示的是,和当前Test.jar 包在同一路径下的mysql-connector-java-5.1.24-bin.jar包。可以将引用的包和当前jar不放在同一目录下,假设mysql-connector-java-5.1.24-bin.jar放置在/home/xyw/目录下,则Class-Path应改为:Class-Path: /home/xyw/mysql-connector-java-5.1.24-bin.jar

    注意:多个jar包之间用空格分开,每行最多72个字符,换行继续必须以空格开头(引用自:http://qyongkang.iteye.com/blog/1666640)

    保存,执行

    [plain] view plain copy
     
     print?
    1. java -jar Test.jar  


    总结:

    推荐方法:

    1、sh脚本执行java程序,将引用包和源码放在同一个文件目录下,java命令通过指定-cp 运行程序。

    2、制作可执行jar包,将jar包和引用包放置在同一目录下,使用Class-Path指定引用包目录。

    我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他 们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其 实我是一个程序员
  • 相关阅读:
    28、vSocket模型详解及select应用详解
    27、通过visual s'tudio 验证 SOCKET编程:搭建一个TCP服务器
    26、TCP服务器原理
    8、字符串操作
    9、内存操作
    ESP32作为接入点AP
    ·通过wifi_scan学习esp32wifi程序编写
    10、指针变量基础
    关于wifi网络基本原理了解
    开发团队中命名规范的重要性
  • 原文地址:https://www.cnblogs.com/kms1989/p/5287958.html
Copyright © 2011-2022 走看看