1

コマンドラインから動作するようにAntスクリプト(現在MyEclipse内から使用中)を変更しているところです。私はこれを行っているので、誰でもプロジェクトをチェックアウトして、MyEclipseなしでビルドできます。私が遭遇している問題は、MyEclipseに舞台裏の依存関係が含まれていることです。これを行うには、ワークスペースのAnt構成を確認し、設定ダイアログで選択したライブラリに基づいてクラスパスをコンパイルします。簡単に言うと、MyEclipseを使用せずに、これらの依存関係を取得し、スクリプトを十分にスマートにして、それらを単独で含める必要があります。

私に頭痛の種を与えているタスクは、sshexecタスクとscpタスクです。これらは、実行するためにjschのバージョンを必要とするオプションのantタスクです。MyEclipseのAntクラスパスからjschを削除し、プロジェクト自体のlibフォルダー(lib / dev)に追加しました。com.jcraft.jsch.UserInfoMyEclipseは、SSHExecクラスがjsch-0.1.44.jarの一部である依存クラスを見つけることができなかったとすぐに文句を言いました。

ビルドスクリプト内からAntのクラスパスを設定する方法がわかりません。スクリプトに要素を追加する次のコードがあります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>

taskdefsshexecタスクとscpタスクを定義するために使用する必要があるようです。

<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、web-jarsにあります。そして、この不正な形式または誤って構成されたtaskdefのために、スクリプトで何も実行できません。

4

2 に答える 2

3

ここでの問題は、SSHExecクラスが、それ自体がWeb-jarクラスローダーにアクセスできないクラスローダーからロードされることです。taskdefにこのクラスパスを指定しても、これは変更されません。各クラスは、独自のクラスローダーと任意の親クラスローダーからのみクラスをロードできますが、web-jarsクラスローダーは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は、web-jarsクラスローダーでUserInfo(およびその他のJSchクラス)を探すことを認識していません。

SSHExecタスクは、通常のantクラスパスのどこかにあると思います。つまり、アプリケーションクラスローダーによってロードされます。次に、antのクラスパスからSSHExecを削除する(またはそれに追加jsch.jarする)ことが、ここでの唯一の解決策のようです。

于 2011-04-27T00:55:34.553 に答える
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="user@host"><fileset dir="..."/></scp>
</target>

~/.ant/lib残念ながら、Eclipse内のAntは、実行のたびに読み取るわけではないため、これをすぐに取得することはありません。Eclipse内で mytargetを1回実行し、失敗するのを確認したら、 [ウィンドウ]>[設定]>[Ant]> [ランタイム]に移動し、[デフォルトに戻す]を押します。これにより、すべての.jarファイル~/.ant/libが[グローバルエントリ]セクションに追加されます。

于 2016-08-08T10:54:03.353 に答える