如何用shell脚本编译java工程

简介:     编译java工程一般直接用IDE或者用Ant、Maven之类的工具,很少有人用纯shell来编译java工程。正好遇到这样一个应该,用这篇博文做一下记录。     案例:本人用eclipse写了一个java project,然后编译打成jar包。
    编译java工程一般直接用IDE或者用Ant、Maven之类的工具,很少有人用纯shell来编译java工程。正好遇到这样一个应该,用这篇博文做一下记录。
    案例:本人用eclipse写了一个java project,然后编译打成jar包。

    这个可以采用eclipse自带的Export就可以导出jar了。但是为了软件自动化等巴拉巴拉的原因,采用存shell脚本编译。


    如图所示,java project的名称为iec104,下面src是源文件目录,bin是所引用的jar包目录,现在要进行编译,并且打成jar,如果对jar有所了解,都知道jar有个MANIFEST.MF文件,iec104工程的MF文件内容如下:

    Manifest-Version: 1.0
    Main-Class: com.zzh.run.Iec104RecvRun
    意思就是制定了运行的main-class(有public static void main(String args[])的类)。
    将这个文件拷贝到iec104的根目录下,然后执行脚本compile.sh,内容如下:
#!/bin/bash

cur_dir=$(pwd)
echo $cur_dir

function do_compile_iec104(){
#    echo $cur_dir
    iec104=$cur_dir/iec104
    iec104_src=$cur_dir/iec104/src
    iec104_bin=$cur_dir/iec104/bin
#    echo $iec104_src
#    echo $iec104_bin
    iec104_class=$cur_dir/iec104/class

# 将iec104的src目录下的所有java文件的名称存入到iec104/src/sources.list文件中
    rm -rf $iec104_src/sources.list
    find $iec104_src -name "*.java" > $iec104_src/sources.list
    cat  $iec104_src/sources.list

# $iec104_class是存放编译的class文件的目录
    rm -rf $iec104_class
    mkdir $iec104_class

# 这里开始编译java文件,注意这里的-encoding utf-8,博主刚开始并没有加入这个,然后就报了一堆错误,纠结了很久才发现,这里给各位提个醒了。
    javac -d $iec104_class -encoding utf-8 -classpath $iec104_bin/classes12.jar:$iec104_bin/junit-4.10.jar:$iec104_bin/log4j-1.2.17.jar:$iec104_bin/mysql-connector-java-5.0.5-bin.jar:$iec104_bin/RXTXcomm.jar -g -sourcepath $iec104_src @$iec104_src/sources.list

# 由于用到了log4j,所以要将log4j的配置文件一并放入,如果没有用到,可以忽略这句
    cp $iec104_src/log4j.properties $iec104_class

# 如果原来在iec104目录下有jar报就删除掉,因为要生成新的
    rm $iec104/iec104.jar
# 这里要cd到存放class的目录,否则如果采用绝对路径编译,编译出来的jar包里面就是绝对路径了,这样就会有问题
# jar -cvfm $iec104/iec104.jar $iec104/MANIFEST.MF $iec104_class/*这样是错误的  
    cd $iec104_class
    jar -cvfm $iec104/iec104.jar $iec104/MANIFEST.MF *
# 赋予可执行权限
    sudo chmod a+x $iec104/iec104.jar
}

do_compile_iec104
exit 0
    运行这个脚本(linux下)就可以编译并且在iec104的目录下就可以看到iec104.jar文件了。
    这里补充下java命令的基本知识:
    javac 用于编译Java文件,格式为:
        java [options] [sourcefiles] [@files]
    其中:
    options:命令行选项;
    sourcefiles:一个或多个要编译的源文件;
    @files:一个或多个对源文件进行列表的文件,有时候要编译的文件很多,一个个敲命令会显得很长,也不方便修改,可以把要编译的源文件列在文件中,在文件名前加@,这样就可以对多个文件进行编译,对编译一个工程很有用,方便,省事。
    有几个比较重要的选项:
    -d 用于指定编译成的class文件的存放位置,缺省情况下不指定class文件的存放目录,编译的class文件将和源文件在同一目录下;
    -classpath 可以简写成-cp,用于搜索编译所需的class文件,指出编译所用到的class文件的位置,如jar、zip或者其他包含class文件的目录,指定该选项会覆盖CLASSPATH的设定;
    -sourcepath用于搜索编译所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目录;
需要注意windows下和linux下文件路径分隔符和文件列表(即-classpath和-sourcepath指定的文件)分隔符的区别:
    windows下文件路径分隔符用 \ ,文件列表分隔符用分号 ;
    linux下文件路径分隔符用 / ,文件列表分隔符用冒号 :



目录
相关文章
|
2月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
61 1
|
3月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
52 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
3月前
|
IDE Java 编译器
Java:如何确定编译和运行时类路径是否一致
类路径(Classpath)是JVM用于查找类文件的路径列表,对编译和运行Java程序至关重要。编译时通过`javac -classpath`指定,运行时通过`java -classpath`指定。IDE如Eclipse和IntelliJ IDEA也提供界面管理类路径。确保编译和运行时类路径一致,特别是外部库和项目内部类的路径设置。
253 5
|
3月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
98 1
|
3月前
|
小程序 Oracle Java
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
这篇文章是关于JVM基础知识的介绍,包括JVM的跨平台和跨语言特性、Class文件格式的详细解析,以及如何使用javap和jclasslib工具来分析Class文件。
64 0
JVM知识体系学习一:JVM了解基础、java编译后class文件的类结构详解,class分析工具 javap 和 jclasslib 的使用
|
4月前
|
Java Shell Windows
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
194 5
|
3月前
|
Java Python
如何通过Java程序调用python脚本
如何通过Java程序调用python脚本
51 0
|
3月前
|
SQL Java 数据库连接
如何在 Java 脚本中有效地使用 JDBC
如何在 Java 脚本中有效地使用 JDBC
24 0
|
3月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
127 1
|
2月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
74 2
6种方法打造出色的Shell脚本