2015-12-19 5 views
2

У меня возникла проблема с процессом сборки на новом сервере, который я настроил только для целей разработки.Ant build не удается развернуть переменные окружения

Это работает на коробке Centos 6 с Java/Tomcat v7. Выход заключается в следующем:

Buildfile: /home/ec2-user/twv/trunk/EES/build.xml 

init: 
    [echo] Build of EES started at 1332 on December 19 2015 

clean: 
    [echo] Cleaning EES 
    [delete] Deleting directory /home/ec2-user/twv/trunk/EES/build 

compile: 
    [echo] Compiling EES 
    [mkdir] Created dir: /home/ec2-user/twv/trunk/EES/build/WEB-INF/classes 
    [javac] Compiling 78 source files to /home/ec2-user/twv/trunk/EES/build/WEB-INF/classes 

BUILD FAILED 
/home/ec2-user/twv/trunk/EES/build.xml:118: /home/ec2-user/twv/trunk/EES/${currentenv.TOMCAT_HOME}/lib does not exist. 

Другие ответы на SO предположить, что переменная среды не создана, но если я запускаю следующее:

echo $TOMCAT_HOME 

возвращается:

/usr/local/tomcat7 

Поэтому я знаю, что переменная существует и установлена.

Это файл build.xml:

<?xml version="1.0"?> 
<!-- ####################################################################### 
         B u i l d S c r i p t 
####################################################################### --> 

<project name="EES" default="war"> 
     <description> EES </description> 
     <property environment="currentenv" /> 
     <property name="tomcat.home" location="${currentenv.TOMCAT_HOME}"/> 
     <property file="build.${currentenv.ANT_HOST_NAME}" /> 
     <property name="webapp.path" value="build"/> 

<!-- ####################################################################### 
       T a r g e t : I n i t 
####################################################################### --> 

    <target name="init"> 
    <tstamp/> 
    <echo>Build of ${ant.project.name} started at ${TSTAMP} on ${TODAY}</echo> 
    </target> 


<!-- ####################################################################### 
       T a r g e t : D e f a u l t 
####################################################################### --> 

     <target name="war" depends="init, clean, compile,compilejsp,copywebroot" description="Bundle up everything"> 
     <!-- target name="war" depends="init, clean,compile,copywebroot" description="Bundle up everything" --> 
       <echo>Packaging ${ant.project.name}</echo> 
       <jar destfile="EES.war" basedir="${webapp.path}"/> 
       <echo>Finished packaging ${ant.project.name}</echo> 
     </target> 

<!-- ####################################################################### 
       T a r g e t : C o p y w e b r o o t 
####################################################################### --> 

     <target name="copywebroot"> 
       <copy todir="${webapp.path}" > 
         <fileset dir="WebRoot"> 
           <include name="**"/> 
         </fileset> 
       </copy> 
     </target> 

<!-- ####################################################################### 
       T a r g e t : j s p c 
####################################################################### --> 
     <target name="jspc"> 

       <taskdef classname="org.apache.jasper.JspC" name="jasper2" > 
         <classpath id="jspc.classpath"> 
           <pathelement location="${java.home}/../lib/tools.jar"/> 
           <fileset dir="${tomcat.home}/bin"> 
             <include name="*.jar"/> 
           </fileset> 
           <fileset dir="${tomcat.home}/lib"> 
             <include name="*.jar"/> 
           </fileset> 
           <fileset dir="${tomcat.home}/lib"> 
             <include name="*.jar"/> 
           </fileset> 
           <fileset dir="${ant.home}/lib"> 
             <include name="ant.jar"/> 
           </fileset> 
         </classpath> 
       </taskdef> 
       <mkdir dir="${webapp.path}/WEB-INF/src"/> 
<!--   <jasper2 verbose="255" 
        validateXml="false" 
        uriroot="${webapp.path}" 
        webXmlFragment="${webapp.path}/WEB-INF/generated_web.xml" 
        outputDir="${webapp.path}/WEB-INF/src" /> --> 
       <java classname="org.apache.jasper.JspC" 
          classpathref="jspc.classpath" 
          fork="true" failonerror="true"> 
         <arg line="-v -d ${webapp.path}/WEB-INF/src -webapp ${webapp.path}"/> 
        </java> 

     </target> 
     <target name="compilejsp" depends="jspc"> 
       <mkdir dir="${webapp.path}/WEB-INF/classes"/> 
       <mkdir dir="${webapp.path}/WEB-INF/lib"/> 

       <javac destdir="${webapp.path}/WEB-INF/classes" 
         optimize="off" 
         debug="on" failonerror="false" 
         srcdir="${webapp.path}/WEB-INF/src" 
         excludes="**/*.smap"> 
         <classpath> 
           <pathelement location="${webapp.path}/WEB-INF/classes"/> 
           <fileset dir="${webapp.path}/WEB-INF/lib"> 
             <include name="*.jar"/> 
           </fileset> 
           <pathelement location="${tomcat.home}/lib"/> 
           <fileset dir="${tomcat.home}/lib"> 
             <include name="*.jar"/> 
           </fileset> 
           <fileset dir="${tomcat.home}/bin"> 
             <include name="*.jar"/> 
           </fileset> 
         </classpath> 
         <include name="**" /> 
         <exclude name="tags/**" /> 
       </javac> 
     </target> 

<!-- ####################################################################### 
       T a r g e t : C o m p i l e 
####################################################################### --> 

     <target name="compile"> 
       <echo>Compiling ${ant.project.name}</echo> 
       <mkdir dir="${webapp.path}/WEB-INF/classes"/> 
       <javac includeAntRuntime="false" srcdir="src" 
           debug="on" 
           destdir="${webapp.path}/WEB-INF/classes"> 
         <!--destdir="${webapp.path}/WEB-INF/classes">--> 
         <classpath> 
           <fileset dir="WebRoot/WEB-INF/lib"> 
             <include name="**/*.jar"/> 
           </fileset> 
           <fileset dir="${tomcat.home}/lib"> 
             <include name="**/*.jar"/> 
           </fileset> 
         </classpath> 
       </javac> 
       <copy file="src/in.xls" 
          tofile="${webapp.path}/WEB-INF/classes/com/xxx/ees/action/in.xls"> 

       </copy> 
     <copy todir="${webapp.path}/WEB-INF/classes"> 
      <fileset dir="src"> 
       <include name="**"/> 
       <exclude name="**/*.java"/> 
       <exclude name="**/*.class"/> 
      </fileset> 
     </copy> 

         <echo>Finished compiling ${ant.project.name}</echo> 
     </target> 



     <!-- ================================= 
      target: deploy 
     ================================= --> 
    <target name="deploy" depends="war" description="--> deploys the war file locally"> 
     <copy todir="${tomcat.home}/webapps" file="EES.war"/> 
    </target> 

     <target name="remotedeploy" depends="war"> 
       <scp keyfile="${user.home}/.ssh/id_dsa" passphrase="" file="EES.war" remoteTodir="[email protected]:" verbose="true"/> 
       <sshexec keyfile="${user.home}/.ssh/id_dsa" host="x.y.com" username="xxx" command="/home/xxx/deployees"/> 
     </target> 

<!-- ####################################################################### 
       T a r g e t : C l e a n 
####################################################################### --> 
     <target name="clean"> 
       <echo>Cleaning ${ant.project.name}</echo> 
       <delete dir="${webapp.path}" > 
       </delete> 
     </target> 
</project> 

Любые советы о том, как исправить?

+0

Можете ли вы разместить содержимое своего 'build.xml'? '$ TOMCAT_HOME' настроен правильно, но сообщение FAILED указывает, что ant-скрипт пытается найти дом TOMCAT внутри вашей папки'/home/ec2-user/twv/trunk/EES', что указывает на некоторую проблему с конфигурацией. Скорее всего, вам придется изменить некоторую конфигурацию, чтобы указать ее в фактическую папку TOMCAT. –

+0

@PrahladYeri Я добавил к первому вопросу выше. – williamsdb

+0

Я не знаком с Centos 6. Вы запускаете скрипт Ant вручную? Если да, отправьте точную командную строку. Если нет, то как он запускается? Через какой-то консольный менеджер? –

ответ

1

Я думаю, что Ant «не видит» TOMCAT_HOME, поскольку системный процесс, в котором Ant был вызван не имеет эту переменную, определенную на нем.

Убедитесь, что вы вызываете Ant из того же системного пользователя, который имеет переменную TOMCAT_HOME в своем профиле, а также что переменные среды сохраняются при запуске Ant.

+0

Вы правы. Я добавил TOMCAT_HOME в env_keep в/etc/sudoers, а затем, когда я запустил sudo ant, он сработал. Благодаря! – williamsdb

0

Не уверен, что это лучшее решение, но я изменил эту строку в build.xml

<fileset dir="${tomcat.home}/lib"> 

, чтобы указать на расположение котом:

<fileset dir="/usr/local/tomcat7/lib"> 

И что сделал трюк.

Если линия прочитал что-то вроде:

<fileset dir="${TOMCAT_HOME}/lib"> 

в соответствии с переменной окружения?

0

Вы временно решили проблему сборки, назначив жестко заданное значение dir="/usr/local/tomcat7/lib", но это не является постоянным исправлением. Если вы отформатируете машину и изменения пути, или если вы передадите этот код кому-то, у кого может быть другой путь установки tomcat, это будет проблемой. Реальным виновником в вашем ant сценария эта строка кода:

<property name="tomcat.home" location="${currentenv.TOMCAT_HOME}"/> 

Вы видите, атрибут location используется в ant свойств, если вы хотите, чтобы указать relative path. Вы указали location атрибут так муравей сборки ищет tomcat установки относительно текущего пути отчаянно (и, следовательно, не может):

/home/ec2-user/twv/trunk/EES/${currentenv.TOMCAT_HOME}/lib 

Решение здесь указать value атрибут вместо location с момента $TOMCAT_HOME относится к абсолютный путь в /usr/local:

<property name="tomcat.home" value="${currentenv.TOMCAT_HOME}"/> 
+0

К сожалению, это не работает, так как теперь сборка не работает. Теперь я получаю: BUILD FAILED /home/ec2-user/twv/trunk/EES/build.xml:51: /home/ec2-user/twv/trunk/EES/${currentenv.TOMCAT_HOME}/bin не существует , который является секцией jspc. – williamsdb

+0

Действительно ли это причина, по которой вы отказали мне в ответе! В любом случае, я все еще думаю, что проблема заключается в неправильном использовании 'location' вместо' value' в вашем скрипте ant. Например, существует строка '', которая также должна быть изменена. Если вы не хотите беспокоиться, тогда просто оставляйте жестко закодированное, как есть. Пока это работает, это прекрасно. –

+0

Во-первых, я не проголосовал за ваш ответ. Не знаю, кто это сделал, но это был не я. Второе изменение местоположения для имени не работало для меня, но жесткое кодирование было сделано, и это все, что мне нужно прямо сейчас. Спасибо – williamsdb