从这个目录结构可以看出,war包主要由两部分组成,一是WebContent,二是classess。
WebContent目录是一个JavaWeb项目中比不可少的一部分,这里面主要存放的是前端代码、Web.xml、lib等文件
classes是编译过后的java文件的二进制文件,后台逻辑都是由这里管控
WebContent目录里面有一个名为WEB-INF的文件夹,我们将classess文件放入这个文件夹,再将整个WebContent目录进行打包,就形成了我们在tomcat发布时使用的war包。
Eclipse有自带的打包功能,一般在Eclipse中,选中项目名称,【右键】>【Export】>【WAR file】,就可以产生一个war包,简单方便。
通过这种方式产生的war包不便于运维人员的管理,当war包很多时,很容易无法分清楚war包的版本,即war包之间的差异。这时候就需要通过命令行进行打包,结合SVN自身的版本控制,随时随地的得到一个预期的war包。
通过命令行进行打包有多种方式,常见的方式有:
不同的打包方式有不同的应用场景。
使用JDK进行打包主要涉及两个命令:javac和jar。
对于一个小的JavaWeb项目,一般涉及的java类不是很多,我们可以使用JDK自带的工具进行产生一个war包。
1.使用javac命令编译所有项目中的java文件,将生成的class文件集中在classes文件夹中,同时要保持它们的包结构。
javac -cp .;G:\Tomcat\apache-tomcat-7.0.63\lib\*;G:\Tomcat\apache-tomcat-7.0.63\bin\*;F:\log\WebContent\WEB-INF\lib\* -d F://classes -encoding utf-8 com/log/controller/*.java
在编译时需要注意的:
源文件。一般JavaWeb只有一个目录存放所有的java文件,但是有时会使用从其它项目的代码,此时会有有多个源文件,比如src、dao-src、beans-src,其中dao-src、beans-src是依赖的源文件。若是这种情况时,需要先将源文件进行合并,按照包结构进行合并。
指定好classpath。一个完整的JavaWeb项目会用到很多jar包,包括JDK自身的jar、tomcat的jar以及在项目中自己引入jar包。
编码问题。要注意java文件的编码格式,一般使用的utf-8,所以编译时指定编码格式为utf-8。若是不指定编码格式时,会默认使用操作系统自身的编码格式,而linux和windows的默认编码时不一样的,在不同环境下运行时会报编码错误
指定class文件的存放路径。使用-d参数指定存放目录,方便打包时拷贝
2.拷贝资源文件
拷贝配置文件。有时我们会将配置文件(如spring、数据库的配置文件)放在src目录下,此时需要将这些配置文件拷贝到classes文件夹中,要保持原有的包结构。
拷贝classes文件夹。将整个classes文件夹拷贝至WebContent/WEB-INF目录里面。
3.生成war包
jar -cvf F:\log\WebContent\* Log.war
C++、C#有一个Makefile的编译工具,ant与其类似,它可以将Java项目进行打包,不仅仅是war、jar文件,还可以是其它类型文件。
在使用ant之前需要在机器上安装ant这个工具,我自身的JDK是1.7版本,使用的ant是1.9.9版本(高版本会不兼容1.7的JDK)。
Ant是Apache的中间件,它依赖与JDK,在安装Ant之前先安装好JDK。
Ant安装完成之后,在命令行中输入”ant -h”,会有如下输出
ant [options] [target [target2 [target3] ...]]
Options:
-help, -h print this message and exit
-projecthelp, -p print project help information and exit
-version print the version information and exit
-diagnostics print information that might be helpful to
diagnose or report problems and exit
-quiet, -q be extra quiet
-silent, -S print nothing but task outputs and build failures
-verbose, -v be extra verbose
-debug, -d print debugging information
-emacs, -e produce logging information without adornments
-lib specifies a path to search for jars and classes
-logfile use given file for log
-l ''
-logger the class which is to perform logging
-listener add an instance of class as a project listener
-noinput do not allow interactive input
-buildfile use given buildfile
-file ''
-f ''
-D= use value for given property
-keep-going, -k execute all targets that do not depend
on failed target(s)
-propertyfile load all properties from file with -D
properties taking precedence
-inputhandler <class> the class which will handle input requests
-find (s)earch for buildfile towards the root of
-s the filesystem and use it
-nice number A niceness value for the main thread: 1 (lowest) to 10 (highest); 5 is the default
-nouserlib Run ant without using the jar files from ${user.home}/.ant/lib
-noclasspath Run ant without using CLASSPATH
-autoproxy Java1.5+: use the OS proxy settings
-main <class> override Ant's normal entry point
Ant的运行依赖与build.xml这个配置文件,build.xml中配置了一个个的target,即任务。每一个targert指定了Ant的行为,如:创建文件夹、删除文件夹、加载classpath、编译文件、拷贝资源、生成war包等任务。任务与任务之间存在依赖关系,即任务的执行顺序。
当build.xml配置完成后,在build.xml所在目录执行“ant”命令,ant会默认加载build.xml文件(当然,你也可以通过-buildfile参数指定配置文件),执行build.xml中定义好的任务。
使用Ant自带的SVN Repositories(https://ant.apache.org/svn.html)可以更好的进行版本控制。
另外,antsvn是Ant的一个插件,也可以从svn上拉取需要的代码。
GIT Repositories(https://ant.apache.org/git.html),Ant也可以与Git进行协作。
一个简单的JavaWeb项目,以及完整build.xml,可以通过ant命令生成一个war包。
里面包含项目源码和build.xml。
Maven与Ant类似也是可以用于打包的工具,Maven相较与Ant,它没有Ant灵活:
MVNRepository(http://www.mvnrepository.com/),在这里才可以查找jar的唯一标识。
Maven官方链接(http://maven.apache.org/),安装Maven之后,在命令行输入“mvn -v”,有如下输出:
C:\Users\user>mvn -v
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04-22T19:57:37+08:00)
Maven home: G:\Maven\apache-maven-3.3.3
Java version: 1.7.0_17, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_17\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 8", version: "6.2", arch: "amd64", family: "windows"
若项目本身是一个Maven项目,进入项目所在目录,输入“mvn package”,变会在项目目录中生成一个名target的目录,里面有生成的war包。