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

最简单的程序Hello World。

首先创建Hello.java

  1. public class Hello {
  2. public static void main(String[] args) {
  3. System.out.println("Hello World");
  4. }
  5. }

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

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

  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 添加执行权限

  1. chmod 777 ex.sh

执行ex.sh

  1. ./ex.sh

打印出Hello World

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

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

新建一个java文件:Test.java

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

这是一个基本的调用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 处在同一个目录中。编写脚本:

  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 命令指定文件类搜索路径

  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:写脚本命令:

  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文件

  1. jar cvf Hello.jar Hello.class

setp2:修改MANIFEST.MF文件

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

  1. Manifest-Version: 1.0
  2. Created-By: 1.7.0_21 (Oracle Corporation)

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

即:

  1. Manifest-Version: 1.0
  2. Created-By: 1.7.0_21 (Oracle Corporation)
  3. Main-Class: Test

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

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

  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包

  1. jar cvf Test.jar Test.class com/ org/

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

step3:修改MANIFEST.MF文件

  1. Manifest-Version: 1.0
  2. Created-By: 1.7.0_21 (Oracle Corporation)
  3. Main-Class: Test

保存,更新jar包,执行

  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包

  1. jar cvf Test.jar Test.class

step3:修改MANIFEST.MF文件

  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)

保存,执行

  1. java -jar Test.jar

总结:

推荐方法:

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

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

sh脚本执行Java程序的更多相关文章

  1. crontab中执行java程序的脚本

    测试场景说明(操作系统:centos7): 有一个bash脚本,脚本内容是执行某个java程序,该脚本为 /data/project1/start.sh crontab -e,添加了以下任务: * * ...

  2. CentOS下crontab执行java程序

    阿里云CentOS收不到邮件 在crontab里配置执行脚本,脚本用来执行java程序,死活不执行.单独执行脚本可以运行. 查看crontab的日志文件,/var/log/cron,发现没有收到cro ...

  3. Linux中crontab无法执行java程序的问题

    Linux中crontab无法执行java程序的问题 jdk环境变量配置问题:可以用全路径来解决: 竟然是kill -9之后,后面的脚本都不运行,这个还没有找到原因啊: 即便是系统级别的 ls 命令, ...

  4. IDEA部署项目,并结合Shell脚本运行Java程序

    一.概述 在实际开发中,我们写好的代码,往往打成war包或jar包,通过winscp或其他软件将其上传至服务器,然而这样非常大的一个弊端就是不利于开发,为什么这么说呢?假如我们刚刚将springboo ...

  5. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  6. JVM执行Java程序时内存的划分

    Java虚拟机在执行Java程序过程中会把它所管理的内存区域划分为若干个不同的数据区域. Java虚拟机所管理的内存包括以下几个运行时区域: 1.程序计数器(Program Couter Regist ...

  7. 在命令符模式下编译并执行Java程序

    对于Java初学者,建议使用纯文本文件来编写Java程序,并在命令符模式下使用工具程序编译和执行Java程序.使用javac工具编译.java,使用java工具执行.class.(推荐sublime编 ...

  8. cmd执行Java程序

    先创建一个文本,里面内容为 public class hello{ public static void main(String[] arg) { System.out.println("H ...

  9. bat执行java程序的脚本解析

    使用java执行带Package的class文件java package1.package2.className  或java -cp .  package1.package2.className - ...

随机推荐

  1. Catalyst揭秘 Day1 Catalyst本地解析

    Catalyst揭秘 Day1 Catalyst本地解析 今天开始讲下Catalyst,这是我们必须精通的内容之一: 在Spark2.x中,主要会以Dataframe和DataSet为api,无论是D ...

  2. 阶段性放弃 wxPython 前的总结

    为了实现一个管理本地电子书的程序,搞了一段时间 GUI,使用 wxPython. 实在难以适应和习惯,也搞不出什么太好看的效果. 最不能忍受的是,多线程处理能力太弱.遂决定放弃 GUI. 放弃之前,整 ...

  3. 1056. Mice and Rice (25)

    时间限制 30 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Mice and Rice is the name of a pr ...

  4. TabControl控件

    private void Form1_Load(object sender, EventArgs e) { #region 显示样式 tabControl1.ImageList = imageList ...

  5. 关于WinForm引用WPF窗体

    项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...

  6. Automotive Security的一些资料和心得(1):Security Engineering

    陆续更新一些最近在Automotive Security方面的资料和心得. 1. Overview 1.1. Software Engineering Process PLC-Phases: Intr ...

  7. CentOS6.4 安装 mongo-connector

    mongo-connector在python2.6.6版本下安装不成功,官方测试2.7,3.3正常 需要升级python2.7 具体步骤: 安装开发工具包: yum groupinstall &quo ...

  8. org.hibernate.LazyInitializationException

    1.org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.c ...

  9. 增强LSH

    通过LSH hash functions我们能够得到一个或多个hash table,每个桶内的数据之间是近邻的可能性很大.我们希望原本相邻的数据经过LSH hash后,都能够落入到相同的桶内,而不相邻 ...

  10. [转载]MongoDB设置访问权限、设置用户

    MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),今天特地花了一点时间研究了一下,研究成果如下: 注:研究成果基于W ...