
# Eclipse普通Java项目如何上云
#### 问题现象
在Eclipse上开发的Java web项目无法在CodeArts Build上构建出包。
#### 原因分析
CodeArts Build不支持通过Eclipse上开发的Java web项目构建出包，需要转换项目。
#### 处理方法
本文档将指导用户如何将项目改造成Ant项目，在CodeArts Build上使用Ant工具进行构建出包。
1. 在项目中创建一个build.xml文件。 
   下图为一个Eclipse创建出来的web项目的demo的目录结构。
   ![](https://support.huaweicloud.com/codeci_faq/zh-cn_image_0000001910750482.png)
   在根目录创建build.xml文件，目录结构变为下图。
   ![](https://support.huaweicloud.com/codeci_faq/zh-cn_image_0000001944389661.png)
   配置文件build.xml内容说明如下：
   ![](https://support.huaweicloud.com/codeci_faq/zh-cn_image_0000001910910494.png "点击放大")
   下面是更加详细的说明，说明后有一个完整的build.xml例子，只要将例子中的各个属性修改成真正的项目对应的内容即可。
   1. **定义属性** **部分**
      - 定义项目名称
        ```
        <property name="project.name" value="JavaWebTest" />
        ```
        
      
      
      
      - 定义包名：打包时生成的.war文件名，这里用到项目名的定义project.name，生成的war包名就是项目名.war。
        ```
        <property name="package.name" value="${project.name}.war" />
        ```
        
      
      
      
      - war包输出路径：上传软件包时以此路径+包名作为构建包路径,value值就是路径，这里可以自己定义。
        ```
        <property name="dist.war.dir" value="./targets" />
        ```
        **注意：如果"./targets"目录不存在，请** **在[init步骤]中创建** **。**
        
      
      
      
      - 源代码(\*.java)路径，这里的value值指向项目java代码存放的路径。
        ```
        <property name="src.dir" value="src" />
        ```
        
      
      
      
      - 源码中WebContent目录路径，这里的value指向项目WebContent代码存放的路径。
        ```
        <property name="webcontent.dir" value="./WebContent" />
        ```
        
      
      
      
      - 源码中WEB-INF目录路径，这里的value指向项目WEB-INF代码存放的路径，通常都是在WebContent目录下，所以引用上面WebContent的路径。
        ```
        <property name="webcontent.webinf.dir" value="${webcontent.dir}/WEB-INF" />
        ```
        
      
      
      
      - class文件输出目录：通常编译后的class文件放在WEB-INF下。
        ```
        <property name="webcontent.webinf.classes.dir" value="${webcontent.webinf.dir}/classes" />
        ```
        **注意：如果** **classes目录** **不存在，请在** **[init步骤]中创建** **。**
        
      
      
      
      - 定义lib路径，这里是你引用的依赖包的存放路径，通常在WEB-INF下。
        ```
        <property name="webcontent.webinf.lib.dir" value="${webcontent.webinf.dir}/lib" />
        ```
        **注意：如果** **lib目录** **不存在，请在** **[init步骤]中创建** **。**
        
      
      
      
      - 定义java版本。
        ```
        <property name="source.version" value="1.8" />
        <property name="target.version" value="1.8" />
        ```
        
      
      
      
      - 定义web.xml路径，不是web项目可以不用定义。
        ```
        <property name="webxml.path" value="${webcontent.webinf.dir}/web.xml" />
        ```
        
       
   
   2. **定义路径** **部分**
      - 定义 classpath 路径，如A引用B，A.java的编译在这里寻找B.class文件。
        ```
        <path id="classpath">
        <!-- 项目的jar包 -->
        <fileset dir="${webcontent.webinf.lib.dir}">
        <include name="**/*.jar" />
        </fileset>
        
        <!-- 项目的classes文件 -->
        <pathelement location="${webcontent.webinf.classes.dir} " />
        
        <!--这里的需要用到的web服务器的包，可自行下载添加-->
        <!-- web 服务器的jar包 -->
        <!-- <fileset dir="${localWebServer.home}/lib">
        <include name="**/*.jar" />
        </fileset>     -->
        </path>
        ```
        
       
   
   3. **定义构建过程**
      - 初始化步骤 （init），包含清空war包输出目录、创建 classes 路径等步骤。
        
        | **属性**       | **描述**                 |
        |:---|:---|
        | \<delete\>标签 | 删除动作，dir属性就是要删除的目录路径   |
        | \<mkdir\>标签  | 创建目录动作，dir属性就是要创建的目录路径 |
        | \<echo\>标签   | 打印动作，message属性就是要打印的内容 |
           
        上面提到的 war包目录（dist.war.dir），编译存放class文件目录（webcontent.webinf.classes.dir），存放依赖包的lib目录（webcontent.webinf.lib.dir），如果原来项目中没有，就要在这一步创建。
        ```
        <target name="init">
        <echo message="删除targets目录(war包输出目录)" />
        <delete dir="${dist.war.dir}" />
        <echo message="创建targets目录(war包输出目录)" />
        <mkdir dir="${dist.war.dir}" />
        <echo message="创建classes目录" />
        <!-- WebContent 下的 classes -->
        <mkdir dir="${webcontent.webinf.classes.dir}" />
        </target>
        ```
        
       
   
   
   - 编译 java 文件，使用\<javac\>标签将java文件编译到"dist.classes"下，编译步骤依赖于init步骤创建的classes目录。
     
     | **属性**        | **描述**                                |
     |:---|:---|
     | depends       | depends="init"声明当前步骤需要在init步骤后使用      |
     | srcdir        | srcdir属性指定上面定义好的java代码的路径属性src.dir    |
     | destdir       | destdir属性指定定义的存放编译完的class文件的classes目录 |
     | source，target | 指定编译时使用的jdk版本                         |
        
     ```
     <target name="compile" depends="init">
     <echo message="使用指定的classpath编译源代码,输出到classes目录" />
     <!-- 这里指定jdk版本为1.8 -->
     <javac encoding="utf-8" listfiles="true" srcdir="${src.dir}"
     destdir="${webcontent.webinf.classes.dir}" debug="on" deprecation="false"
     optimize="true" failonerror="true" source="${source.version}" target="${target.version}">
     <classpath refid="classpath" />
     </javac>
     </target>
     ```
     
   
   
   
   - 将编译完的项目打成war包，首先使用\<delete\>标签清理掉原有的war包，再使用\<war\>标签打包。
     
     | **属性**         | **描述**                |
     |:---|:---|
     | warfile        | 该属性定义打出来的war包的包名，包含路径 |
     | webxml         | 指定web.xml的路径          |
     | \<fileset\>子标签 | 指定webContent路径        |
        
     ```
     <target name="war" depends="compile" description="将工程打成 war 包">
          <echo message="生成war包" />
          <delete file="${dist.war.dir}/${package.name}" />
          <war warfile="${dist.war.dir}/${package.name}" webxml="${webxml.path}">
              <fileset dir="${webcontent.dir}">
              </fileset>
          </war>
     </target>
     ```
     
   
   
   ![](https://support.huaweicloud.com/codeci_faq/public_sys-resources/note_3.0-zh-cn.png)
   如果是要打jar包，这里就不能用\<war\>标签，而是用\<jar\>标签，示例如下：
   - jarfile属性和war包的属性类似，是存放打好的jar包存放的路径，需要在上面属性定义阶段定义，basedir属性是编译后的class的目录，就是上面的打war包时定义的webcontent.webinf.classes.dir属性。
   
   - jar包就不需要webxml属性了。
   
   - 如果要打的jar包是需要使用java -jar来执行的可执行jar包，则需要定义manifest，如果只是一个功能性的，被依赖的jar包就不需要了。
     Main-Class指定main函数所在的类。
     ```
     <target name="jar" depends="compile" description="make jar file">
     <!--jar操作，jarfile指定jar包存放路径，basedir为编译后的class的目录-->
     <jar jarfile="${jarfilename}" basedir="${classes}">
     <!--为jar包指定manifest，当然，如果jar包不需要打成runnable的形式，manifest可以不要-->
     <manifest>
     <!--指定main-class-->
     <attribute name="Main-Class" value="demo.SayHello" />
     </manifest>
     </jar>
     </target>
     ```
     
    
   下面是完整的build.xml示例，供参考，通常只需要把属性定义阶段里面那些路径按照实际项目的路径填充好就可以。
   ```
   <?xml version="1.0"?>
   <project default="war" basedir=".">
           <echo message="pulling in property files" /> <property file="build.properties" />
           <property name="project.name" value="JavaWebDemo" />
           <property name="package.name" value="${project.name}.war" />
           <property name="dist.war.dir" value="./targets" />
           <property name="src.dir" value="src" />
           <property name="webcontent.dir" value="./WebContent" />
           <property name="webcontent.webinf.dir" value="${webcontent.dir}/WEB-INF" />
           <property name="webcontent.webinf.classes.dir" value="${webcontent.webinf.dir}/classes" />
           <property name="webcontent.webinf.lib.dir" value="${webcontent.webinf.dir}/lib" />
           <property name="source.version" value="1.8" />
           <property name="target.version" value="1.8" />
           <property name="webxml.path" value="${webcontent.webinf.dir}/web.xml" />
           
           <path id="classpath">
   <fileset dir="${webcontent.webinf.lib.dir}">
   <include name="**/*.jar" />
   </fileset>
   <pathelement location="${webcontent.webinf.classes.dir} " />
   </path>
          <target name="init">
               <echo message="删除targets目录(war包输出目录)" />
               <delete dir="${dist.war.dir}" />
               <echo message="创建targets目录(war包输出目录)" />
               <mkdir dir="${dist.war.dir}" />
               <echo message="创建classes目录" />
               <mkdir dir="${webcontent.webinf.classes.dir}" />
          </target>
          
   <target name="compile" depends="init">
   <echo message="使用指定的classpath编译源代码,输出到classes目录" />
   <javac encoding="utf-8" listfiles="true" srcdir="${src.dir}"
   destdir="${webcontent.webinf.classes.dir}" debug="on" deprecation="false"
   optimize="true" failonerror="true" source="${source.version}" target="${target.version}">
   <classpath refid="classpath" />
   </javac>
   </target>
          <target name="war" depends="compile" description="将工程打成 war 包">
               <echo message="生成war包" />
               <delete file="${dist.war.dir}/${package.name}" />
               <war warfile="${dist.war.dir}/${package.name}" webxml="${webxml.path}">
                     <fileset dir="${webcontent.dir}">
                     </fileset>
               </war>
          </target>
   </project>
   ```
   
   
2. 将改好的build.xml提交到代码仓库，创建Ant类型的构建任务。 
   ![](https://support.huaweicloud.com/codeci_faq/zh-cn_image_0000001910750494.png "点击放大")
   
   上传软件包到软件发布库中的构建包路径就可以按照上面build.xml说明的那样填写war包输出路径加上包名的格式。
   ![](https://support.huaweicloud.com/codeci_faq/zh-cn_image_0000001910910502.png "点击放大")
   
   
   
3. 保存任务，执行构建，构建成功之后，就可以在软件发布库看到编译打包完成的war包。
 
