2011-04-26 5 views
1

현재 MyEclipse 내에서 사용중인 Ant 스크립트를 수정하는 중입니다. 명령 행에서 작동합니다. 저는 누구든지 프로젝트를 체크 아웃하고 MyEclipse없이 빌드 할 수 있도록이 작업을 수행하고 있습니다. 내가 겪고있는 문제는 MyEclipse가 배후에서 종속성을 포함한다는 것입니다. 이 작업은 작업 공간의 Ant 구성을보고 환경 설정 대화 상자에서 선택한 라이브러리를 기반으로 클래스 경로를 컴파일하여 수행됩니다. 간단히 말해서, 필자는 MyEclipse의 도움없이 이러한 종속성을 가져 와서 스크립트를 자체적으로 포함시킬만큼 현명한 스크립트를 작성해야합니다. 나에게 두통을주고있다Ant 옵션 작업의 문제점 SSHExec 및 SCP. 클래스 패스 문제?

하는 작업은 sshexec 및 SCP 작업입니다. 이들은 jsch 버전을 실행해야하는 선택적인 ant 작업입니다. MyEclipse의 Ant 클래스 경로에서 jsch를 제거하고 프로젝트 자체 (lib/dev)의 lib 폴더에 추가했습니다. MyEclipse는 SSHExec 클래스가 jsch-0.1.44.jar의 일부인 종속 클래스 인 com.jcraft.jsch.UserInfo을 찾을 수 없다는 이유로 즉시 불평했습니다.

나는 빌드 스크립트에서 개미의 클래스 경로를 설정하는 방법을 볼 수 없습니다. 나는 스크립트에 path 요소를 추가하는 다음 코드를 가지고 있지만 Ant가 명시 적으로 작업 또는 다른 요소에 연결하지 않는 한이를 사용하지 않는다고 생각하지 않습니다.

<path id="web-jars"> 
    <fileset dir="${web-lib}"> 
    <include name="**/*.jar" /> 
    </fileset> 
    <fileset dir="${app-lib}"> <!-- this is where jsch resides --> 
    <include name="**/*.jar" /> 
    </fileset> 
</path> 

그것은 내가 sshexec 및 SCP 작업을 정의 할 taskdef를 사용할 필요가 보인다 :

<taskdef name="sshexec" classname="org.apache.tools.ant.taskdefs.optional.ssh.SSHExec" 
    classpathref="web-jars"/> 

은 MyEclipse이 뿌려 "taskdef A class needed by class org.apache.tools.ant.taskdefs.optional.ssh.SSHExec cannot be found: com/jcraft/jsch/UserInfo"

그것은 classpathref, 웹 항아리에 분명합니다. 이 형식이 잘못되었거나 잘못 구성된 taskdef 때문에 스크립트에서 아무 것도 실행할 수 없습니다. 여기

+0

다음은이 문제를 해결할 수 있습니다. http://stackoverflow.com/a/39976060/3499805 – user3499805

답변

3

문제는 SSHExec 클래스 자체가 당신의 웹 항아리 클래스 로더에 액세스 할 수 없습니다 클래스 로더에서로드 된 것입니다. taskdef에 대해이 클래스 경로를 제공하더라도 변경되지 않습니다. (SSHExec 여기에서 찾을 수 보이기 때문에 그것은 가능성이 그 반대입니다) 각 클래스는 자신의 클래스 로더 및 부모 클래스 로더에서 클래스를로드 할 수 있지만, 웹 항아리 클래스 로더는 SSHExec의 클래스 로더의 상위 클래스 로더가 아닙니다.

그것은 다음과 같습니다

ClassLoader web-jars -------------> application CL -------------> bootstrap CL 

taskdef 
     => look for SSHExec here 
      => look first in parent class loader 
            => look for SSHExec here 
            => look first in parent class loader 
                    => look for SSHExec here 
                    => not found 
            => look in our own classpath 
            => found, load the class 
            => it somehow uses interface UserInfo 
            => look for UserInfo here 
            => look first in parent class loader 
                    => look for UserInfo here 
                    => not found 
            => look in our own classpath 
            => not found, throw exception. 

VM는, 사용자 정보 (다른 JSch 클래스) 웹 항아리 클래스 로더에서 찾기 위해 아무 생각이 없습니다.

은 내가 SSHExec 작업이 응용 프로그램 클래스 로더에 의해로드 된 보통의 개미 클래스 경로, 즉 어딘가에 가정하자. 그런 다음 개미 클래스 패스 (또는 그것에 jsch.jar 추가)에서 SSHExec을 제거하는 것이 유일한 해결책 인 것 같습니다.

+0

Thanks @ Palo-Ebermann. 그것은 많은 의미가 있습니다. 그러나 SSHExec을 제거하는 것이 해결책 일 수 있다고 언급했습니다. 개미 클래스 경로 (ant/lib)에서 SSHExec (ant-jsch.jar)을 제거하면 다른 곳에 놓아야합니다. 나는 그것을 단순히 제거 할 수 없다. 클래스 패스에서 classname을 찾을 수 없으므로 Ant가 'sshexec'taskdef에서 실패하게됩니다. 내가 놓친 게 있니? – jinxed

+1

taskdef의'classpath' 또는'classpathref'에 그것을 추가해야한다고 생각합니다. 'web-jars' 경로를 참조하는 새로운''정의를 사용할 수 있습니다. –

0

~/.ant/lib 디렉토리를 만들고 빌드 초기화의 일부로서 거기에 jsch.jar 복사합니다. scp/sshexec 작업을 수행하는 모든 작업은이 init 대상에 의존해야합니다.

<target name="init"> 
    <property name="user.ant.lib" location="${user.home}/.ant/lib"/> 
    <mkdir dir="${user.ant.lib}"/> 
    <copy todir="${user.ant.lib}"> 
    <fileset dir="${basedir}/build/tools" includes="jsch-*.jar"/> 
    </copy> 
</target> 

<target name="mytarget" depends="init"> 
    <scp todir="[email protected]"><fileset dir="..."/></scp> 
</target> 
이클립스

개미 불행히도 모든 실행에 ~/.ant/lib를 읽을하지 않는 한 즉시를 선택하지 않을 것이다; 창> 환경 설정> 개미> 런타임가 기본값 복원 눌러 -이 중 하나를 추가합니다 : 한 번 이클립스 내에서 mytarget을 실행하고 실패 시청 한 후, 다음으로 이동합니다.jar 파일을 ~/.ant/lib에서 글로벌 항목 섹션으로 가져 가야합니다.