2011-02-24 3 views
8

개미 스크립트에서 scpsshexec 및 기타 원격 명령을 많이 실행합니다. jsch.jar이 개봉 lib 디렉토리에 없으면이 명령이 작동하지 않습니다. 그것을 작동시키기 위해서 JAR을 개미 lib 디렉토리에 복사했지만,이 방법은 좋은 해결책이 아닙니다. 스크립트를 실행하고 싶은 다른 사람들도 똑같이해야 할 것입니다. Teamcity에서 ant 대상을 실행하려면 명시 적으로 lib 파일의 경로를 설정해야합니다.ant 빌드 파일에서 JAR의 경로를 어떻게 지정합니까?

개미 XML 자체에서 JAR의 경로를 지정할 수있는 방법이 있습니까?

+0

개미 샘플을 테스트 해 보셨습니까? 나는 그것이 효과가 없어야하는 이유를 보지 못합니다. 다른 작업에도 같은 방식으로 사용합니다. – Robert

+0

작동하지 않는다고 말하는 것은 아니지만 작동하지만 피하려고하는 ant lib 디렉토리에 jsch.jar를 추가해야합니다. 죄송합니다. 제 질문에 해당 사실이 명시되어 있지 않은 경우. <파일 세트 디렉토리 = "dir1"> 다음과 같은 작업이 있습니다. { }이 작업을하려면 jsch.jar을 ant lib에 수동으로 추가해야합니다. 빌드 파일에 무엇인가 넣음으로써 피할 수 있습니까? – Ravi

+0

jsch.jar이 lib 디렉토리에 없으면 삭제 한 스 니펫도 작동합니다. 그런 다음 올바른 상대 경로 또는 절대 경로를 지정해야합니다. – Robert

답변

4

답장을 보내 주셔서 감사합니다. 클래스 로더 작업으로 작동하도록 관리됩니다. 이것이 내가 한 일이다.

<project basedir="." > 
    <property environment="env"/> 

    <taskdef resource="net/jtools/classloadertask/antlib.xml"> 
    <classpath> 
     <fileset dir="${basedir}/lib" includes="ant-classloader*.jar"/> 
    </classpath> 
    </taskdef> 

    <!--Add JSCH jar to the classpath--> 
    <classloader loader="system"> 
    <classpath> 
     <fileset dir="${basedir}/lib" includes="jsch*.jar"/> 
     </classpath> 
    </classloader> 

    <target name="Test"> 
     <scp todir="user1:[email protected]:/tmp" trust="true" > 
     <fileset dir="dir1"> 
      <include name="test.txt" /> 
     </fileset> 
     </scp> 
    </target> 
</project> 

여기서 볼 수 있듯이 "테스트"대상에 대한 종속 대상을 제공 할 필요는 없습니다. 클래스 로더를 사용하여 jsch.jar을 시스템 클래스 로더에 추가합니다.

+0

클래스 로더가 필요하다고 생각하지 않습니다. 파일 맨 위의 경로 선언은 taskdef ant task의 classpathref 속성과 결합하여 정상적으로 작동했을 것입니다. –

+0

taskdef를 다시 선언해야합니다. lib 디렉토리에서 ant-jsch.jar을 제거하고 scp 및 sshexec에 nw taskdef를 추가해야합니다. – Ravi

+0

이 솔루션은 훌륭하게 작동했습니다. 클래스 로더 jar 및 정보는 http://enitsys.sourceforge.net/ant-classloadertask/에서 찾을 수 있습니다. – zombat

2

한 가지 가능한 해결 방법은 -lib 명령 줄 옵션을 사용하여 개미를 추가로 검색 할 위치를 알려주는 것입니다. 아마도이 옵션이 설정된 ant을 호출하는 래퍼 스크립트를 만들 수 있습니다.

또 다른 방법은 ant-jsch.jar 파일 (ant lib 디렉토리에서 jsch.jar 파일이 아니라 작업을 정의하는 ant와 함께 제공되는 jar 파일)을 이동하여 taskdef을 생성하는 것입니다 당신의 SSH 작업에 대해 하나의 내장, 다음 jsch.jar이 작업에 대한 클래스 경로 설정에 분리와 ant-jsch.jar :

<taskdef name="sshexec" 
    classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec"> 
    <classpath> 
    <pathelement location="jsch-0.1.44.jar"/> 
    <pathelement location="ant-jsch.jar" /> 
    </classpath> 
</taskdef> 

그것을도에 변경을 수반하기 때문에 나는이 비록 당신을 도울 것입니다 확실하지 않다 lib 디렉토리.

필자가 아는 한 일반적으로 빌드 파일 자체에 내장 된 작업에 필요한 추가 병을 지정할 수 없습니다. 예를 들어 junit과 같은 특별한 경우가 있습니다.

+0

작업에 하나 이상의 JAR이 필요한 경우 문제가 발생하면 왜 모든 JAR을 하나의 JAR로 만들지 않을까요? – Robert

+1

내가 제어 할 수 없어서 ant lib 디렉토리를 변경하고 싶지 않습니다. 이 옵션은 해당 시나리오에서 작동하지 않습니다. – Ravi

1

빌드가 더 많은 크로스 플랫폼이되도록하려면 종속성 관리를 사용하는 것이 좋습니다. ivy plug-in은 빌드시 빌드의 플러그인 버전을 자동으로 설치할 수 있습니다.

이 방법은 당신이 이제까지 당신의 ANT lib 디렉토리에 설치해야합니다 마지막 항아리 파일 ivy.xml에서 프로젝트의 종속성을 선언 아이비 2.2.0.jar :-)

첫 번째 의미

<ivy-module version="2.0"> 
    <info organisation="com.myspotontheweb" module="demo"/> 
    <configurations> 
     <conf name="anttask" description="Jars implementing ANT tasks"/> 
    </configurations> 
    <dependencies> 
     <dependency org="com.jcraft" name="jsch" rev="0.1.42" conf="anttask->default"/> 
    </dependencies> 
</ivy-module> 
당신의 의 build.xml 실행 아이비 내

와 담쟁이 구성에 따라 사용자 정의 클래스 경로를 채우는 데 사용 :

<target name='init' description='Resolve project dependencies and set classpaths'> 
    <ivy:resolve/> 
    <ivy:cachepath pathid="anttask.path" conf="anttask"/> 
</target> 

마지막으로, 빌드의 다른 곳에서 이제 아이디로 자동 채워지는 클래스 경로를 사용하여 ANT 작업을 선언합니다.

<target name='dosomething' depends="init"> 
    <taskdef name="sshexec" 
      classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec" 
      classpathref="anttask.path"/> 
    .. 
    .. 
</target> 

이 방법은 모든 ANT 플러그인에서 작동하며 대부분 중앙 Maven 저장소에서 사용할 수 있습니다. 두 번째 이점은 모든 빌드에서 플러그인 버전을 쉽게 업그레이드 할 수 있다는 것입니다.

+0

이것은 클래스로드 요구 사항을 충족시키기 위해 개미 디렉토리에 있어야하는 몇 가지 항아리 문제를 수정하지 않습니다. 실제 개미 작업은 별도로 다운로드 한 jsch.jar가 아닌 ant와 함께 제공되는 ant-jsch.jar에 정의됩니다. 문제는 jsch.jar을 ant-jsch.jar의 클래스에 표시하는 것입니다. 또는 나는 무엇인가 놓치고 있냐? – matt

+0

taskdef 태스크의 "classpathref"속성을 점검하십시오. 작업을 선언 할 때 사용할 클래스 경로를 지정할 수 있습니다. ivy가 제공하는 지원은 빌드시 클래스 경로를 다운로드하고 채울 수있는 기능입니다. 이것은 Maven 빌드 도구가하는 것이며, 플러그인은 모두 다운로드됩니다. –

+0

나는 당신의 접근 방식을 매우 좋아하지만, 다시 한번 각 태스크는 ** init ** 태스크를 먼저 호출해야합니다'depends = "init"'. 나는 "한 번 변경하고 모든 것을 위해 일하는"접근 방식과 같은 옵션을 찾고 있습니다. – Ravi

관련 문제