java命令行构建(三)

来源:互联网 发布:非农数据哪个网站 编辑:程序博客网 时间:2024/06/07 15:04

前面已经说了打jar包,那怎么打成war包呢?

打成war包会把lib中的jar也加进来,虽然导致war文件有点大,但贵在一个文件,比较方便.

打war包命令也是直接用jar即可:

jar -cvf myh.war *

先看工程的结构:

│  build.py│├─build├─conf│      log4j.xml│├─lib│      jsp-api.jar│      log4j.jar│      servlet-api.jar│├─src│  └─com│      └─yp│          └─test│              └─servlet│                      MyServlet.java│└─WebContent    │  index.jsp    │    └─WEB-INF            web.xml

只有一个servlet

package com.yp.test.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;/** * Servlet implementation class MyServlet */public class MyServlet extends HttpServlet {    private static final long serialVersionUID = 1L;    static Logger log = Logger.getLogger(MyServlet.class);    /**     * Default constructor.     */    public MyServlet() {        // TODO Auto-generated constructor stub    }    /**     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)     */    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub        log.info("hello!!!!!log4j");        response.sendRedirect("index.jsp");    }    /**     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)     */    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        // TODO Auto-generated method stub    }}

web.xml增加:

  <servlet>    <description></description>    <display-name>MyServlet</display-name>    <servlet-name>MyServlet</servlet-name>    <servlet-class>com.yp.test.servlet.MyServlet</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>MyServlet</servlet-name>    <url-pattern>/MyServlet</url-pattern>  </servlet-mapping>

build.py代码:

#!/usr/bin/python#coding:UTF-8import paramiko,datetime,os,loggingimport os,shutilimport sysimport time# 遍历文件侠def getFiles(dir, suffix):    res = []    for root, directory, files in os.walk(dir):        for filename in files:            name, suf = os.path.splitext(filename)            if suf == suffix:                res.append(os.path.join(root, filename))    return res# 一些变量jarFileName = "myh.jar"webFold = "WebContent"basedir = os.getcwd()# clean,init some pathlogging.error("current workplace:"+os.getcwd()+",clean build")if os.path.exists(basedir+"\\"+"build"):    shutil.rmtree(basedir+"\\"+"build")os.mkdir(basedir+"\\"+"build")os.mkdir(basedir+"\\"+"build\\classes")# compilelogging.error("begin compile")# 把文件列表加入到sourcefiles 文件中file=open('sourcefiles','w')for tfile in getFiles(basedir+'/src/', '.java'):    file.writelines (tfile+'\n')file.close()# 执行编译os.chdir(basedir)result = os.system("javac -encoding utf8 -sourcepath src @sourcefiles -d build/classes  -Djava.ext.dirs=./lib ")# 判断编译结果if result!=0:    logging.error('javac error')       os.system("pause")    sys.exit()# logging.error("开始copy配置文件")os.system("cp conf/* build/classes")# copy lib和classesos.system('cp -r lib '+basedir+'/'+webFold+'/WEB-INF/')os.system("cp -r "+basedir+"/build/classes  "+basedir+"/"+webFold+"/WEB-INF/")# waros.system("jar -cvf myh.war -C "+webFold+"/ .")# cleanos.remove(basedir+"/sourcefiles")os.system("pause")

测试:

放到tomcat后,启动tomcat 启动
http://127.0.0.1:8080/myh/MyServlet 就可以看到效果了.

说明:

  • WEB-INF是 javaee的标准结构,里面有个web.xml, tocmat等jee容器即认.
  • 打war包比打jar包要简单,毕竟不用去管可运行文件和清单文件,只需要把jar扔到 WEB-INF/lib中即可。
  • javac命令中,没有用 classpath了,而是用 -Djava.ext.dirs=./lib ,用classpath选项的话,就要生成多个jar包的路径到 -cp后. 用 -Djava.ext.dirs 是有风险的,请参考http://blog.csdn.net/scugxl/article/details/43240991
  • 我是先把java文件编译成class文件放到build/classes中,然后把文件夹cp到 WEB-INF下
  • 打成war 包下面的清单文件貌似没啥用。
  • 需要两个入参:jarFileName,webFold
  • 代码:https://github.com/huawumingguo/javacmd/
0 0