如何在Linux上部署Java应用程序
如何在Linux上部署Java应用程序
==========================
设置Linux的.bash_profile
==========================
在.bash_profile中设置JAVA_HOME和CLASSPATH变量, 并将$JAVA_HOME/bin加到PATH变量中
###begin of JAVA CONFIGURATION
JAVA_HOME=/usr/jdk1.6.0_21
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CLASSPATH
export CLASSPATH
PATH=$JAVA_HOME/bin:$PATH
export PATH
###end of JAVA CONFIGURATION
==========================
Hellow world程序的部署
==========================
对于hello world一类的程序, 往往只有很少的几个java文件, 除了jre System Library之外, 不依赖其他架包. 部署这类程序很简单, 只需要将这些java源码编译成.class, 把这个class文件拷贝到Linux机器上, 就可以运行了. 编译和运行的方法是:
编译:
javac helloworld.java
运行(如果不需要依赖架包):
java helloworld
运行(如果依赖其他架包):
java -cp abc.jar:def.jar helloworld
==========================
实际项目程序的部署
==========================
对于多数java程序, 会包含很多个java文件, 而且通常会引入一些常用的架包, 比如log4j,commons-lang3-3.0.jar等等. 如果还是以class文件的形式部署, 会非常繁琐. 幸好java支持jar部署.
比如我们有一个project_abc项目, 在eclipse中的文件结构为:
src
abc.java
def.java
test
lib
log4j-1.2.9.jar
commons-lang3-3.0.jar
Eclipse有2个打包jar的向导, 使用方法是, 在package explorer中选中项目, 右击菜单中选择<export>, 在之后的export界面上, 有两个向导可供选择:
1.选择java/jar项
2.选择java/runnable jar file项
假设我们使用java/jar导出向导, 为了减小jar的文件大小, 将不导出lib目录下的所有架包, 同时选择自动生成 MANIFEST.MF 文件(还有一个选项为, 选择已有的 MANIFEST.MF 文件, 这个特性很重要哦, 如果我们每次打包后都需要修改 MANIFEST.MF 文件, 是相当痛苦的事情). 最后通过该向导导出的jar文件为project_abc.jar
下面举例说明要在Linux上的/home/user_1/project_abc 中部署project_abc.jar, 在将project_abc所使用的架包统统拷贝到/home/user_1/project_abc/lib目录后, 试着输入如下命令
java -jar project_abc.jar,
报错, 原因是project_abc.jar不知道如何加载所需要的架包
java -cp lib/log4j-1.2.9.jar:lib/commons-lang3-3.0.jar -jar project_abc.jar
依旧报错, 原因仍是project_abc.jar不知道如何加载所需要的架包, 这次错误好像不应该啊, 已经指定了classpath, 为什么呢? 愿意是加了-jar选项后, 就会忽略-cp选项, 所以project_abc.jar还是不知道如何加载所需要的架包. 这时候, 需要我们修改project_abc.jar中的 MANIFEST.MF 文件, 在 MANIFEST.MF 中指定 classpath属性.
原来的 MANIFEST.MF 内容为
Manifest-Version: 1.0
Main-Class: com.abc.project_abc.Monitor
修改后的 MANIFEST.MF 内容为
Manifest-Version: 1.0
Main-Class: com.smic.edw.etl.unloadingfw.assembly.JobMonitor
Class-Path: цц
ццlib/commons-lang3-3.0.jarцц
ццlib/log4j-1.2.9.jarцц
цц
Created-By: Apache Ant 1.5.1
上面的ц为空格, Class-Path的格式比较变态,详见http://www.rgagnon.com/javadetails/java-0587.html, 简单讲
1. 第一个jar前面至少有一个空格
2. 两个jar路径之间至少包含2个空格
3. 最后一个jar至少有一个空格
为了避免编辑器自动将行尾的空格trim掉, 可以在每行前面放2个空格, 最后再加上一个可有可无的Created-By属性.
==========================
如何自动化打包和替换MANIFEST.MF文件过程
==========================
前面讲过, 使用Eclipse export有2个打包向导. 通常, 项目需要不断修改, 不断地打包, 然后再部署到Linux上做测试. 这时候, 要能自动化完成打包操作就能爽了.
1.选择java/jar向导(能支持半自动化打包)
在该向导的最后环节, 可以选择是否要将该向导设置的选项保存为一个jar description文件(扩展名为.jardesc). 如果我们保存了jardesc文件, 以后, 可以在eclipse中点击jardesc文件来直接调出export向导, 很方便就能完成打包过程. 当然, 为了解决classpath问题, 我们应该使用已经编辑好的 MANIFEST.MF 文件, 而不是让向导自动生成一个全新的 MANIFEST.MF 文件.
2.java/runnable jar file向导(能支持全自动化打包)
该向导可以将打包过程生成为ant xml文件, 一旦有了这个xml文件, 你就可以使用ant来完成自动化打包.该向导的名称为runnable jar file,从名称看, 好像是仅仅适合于可运行程序的打包,我猜想通过修改ant的xml文件, 应该也支持类库的打包.
至于关于如何使用ant, 可以看
http://www.simonwhatley.co.uk/using-ant-with-eclipse