3

最近システムを Mint12 から Mint14 にアップグレードしましたが、古いプロジェクトを新しいシステムでうまく動作させるのに深刻な問題がありました。すべてを要約すると:

  • Mint14 が正常に動作するようになり、すべての必須ソフトウェア (Eclipse、ANT など) がインストールされました
  • バックアップ ディスクからファイルを復元しました
  • Oracle JDK をデフォルトの Java バージョンとして設定する
  • SVN から私のプロジェクトの新しいコピーをチェックアウトしました
  • 新しい user_id を反映するように、ビルド ファイル内のすべてのパスを更新しました。

これで問題ありませんが、プロジェクトをビルドしようとすると、次のエラーが発生するように、私の ant ビルドが何らかの形で台無しになっているようです。

~/new_workspace/my_project $ ant dist
Buildfile: /home/my_userid/new_workspace/my_project/build.xml
  [taskdef] Could not load definitions from resource net/sf/antcontrib/antlib.xml. It could not be found.

init:

compile:
    [javac] /home/my_userid/new_workspace/my_project/build.xml:246: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

static:

dist:
      [svn] <Status> started ...
      [svn] svn: This client is too old to work with working copy '/home/my_userid/new_workspace/my_project'; please get a newer Subversion client
      [svn] svn: This client is too old to work with working copy '/home/my_userid/new_workspace/my_project'; please get a newer Subversion client
      [svn] <Status> failed !

BUILD FAILED
/home/my_userid/new_workspace/my_project/build.xml:104: Can't get status of /home/my_userid/new_workspace/my_project

Total time: 0 seconds

「古すぎて作業コピーを使用できません...」というメッセージに気付きましたが、確認するsvn --versionと 1.7.5 で問題ないことがわかりました。サーバー上のSVNバージョンはその間変更されていないことに注意してください。プロジェクト (Eclipse 経由でチェックアウトし、Subclipse 1.6 を使用) は、コマンド ライン経由で ANT が使用するバージョンでは動作しないという理論がありますが、その場合、クライアントのバージョンは古すぎるのではなく、新しすぎるのです!? Subversion を「ダウングレード」する価値はありますか?

それ以外の場合、何が問題になる可能性があり、どうすれば解決できますか? プロジェクトが正常に機能することを確認するために確認する必要がある、その他の一般的な問題 (ディストリビューションのアップグレード/移行中に発生する可能性がある) はありますか? (以下は、ビルド ファイルの関連部分です)


このビットは svn バインディングを定義します

  <path id="svnant.classpath">
    <fileset dir="/home/my_userid/.ant/lib">
      <include name="svnant.jar" />
      <include name="svnClientAdapter.jar" />
      <include name="svnjavahl.jar" />
      <!-- <include name="svnkit.jar" /> tried this as well but no joy -->
    </fileset>
  </path>

「dist」ターゲットの関連ビット:

  <target name="dist"
          depends="compile,static" description="Compiles and builds jar files">

    <mkdir dir="${dist}"/>
    <buildnumber file="project-version.properties"/>
    <property name="version.number" value="${major.version}.${minor.version}.${micro.version}"/>
    <svn>
      <status path="."
              lastChangedRevisionProperty="rev.number" />
     <info target="." />
    </svn>
    ...
4

2 に答える 2

2

最初の問題が表示されます。

[taskdef] Could not load definitions from resource net/sf/antcontrib/antlib.xml. It could not be found.

これは<taskdef>、ファイルのどこかにタスクがありbuild.xml、欠落しているオプションの Ant jar が見つからないことを示しています。

私の理論: の下の古い Ant バージョンで$ANT_HOME/libは、Ant-Contrib jar をインストールしました。このディレクトリは$CLASSPATHデフォルトで Ant にあるため、タスク ラインで指定する必要はありませんでした<taskdef>。したがって、次のようになります。

<taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

これらのオプションのタスク jar を常にプロジェクトに配置することを常にお勧めします。このように、これらの jar は既にプロジェクトにあるため、動作させるためにこれらの jarをインストールする必要はありません。

次のようになります。

<property name="antlib.dir"       value="${basedir}/antlib"/>
<property name="ant-contrib.lib"  value="${antlib.dir}/ac"/>

<taskdef resource="/net/sf/antcontrib/antlib.xml">
    <classpath>
        <fileset dir="${ant-contrib.lib/>
    </classpath>
</taskdef>

antlib/ac/ant-contrib-1.03b.jarあなたのporojectに追加してください。このようにして、誰かがあなたのプロジェクトをチェックアウトすると、ant-contrib jar をダウンロードして自分のマシンにインストールしなくてもビルドされます。

ant.xmlを使用していないことに注意してくださいantcontrib.properties<for/>これにより、古いタスクの代わりにタスクにアクセスできるようになり<foreach>ます。すべては、このAnt-Contrib インストールページで説明されています。


今他のエラー:

dist:
      [svn] <Status> started ...
      [svn] svn: This client is too old to work with working copy '/home/my_userid/new_workspace/my_project'; please get a newer Subversion client
      [svn] svn: This client is too old to work with working copy '/home/my_userid/new_workspace/my_project'; please get a newer Subversion client
      [svn] <Status> failed !

まず、実際の問題は、Subversion のクライアント バージョンが実際には新しすぎて、古すぎないことです。Ant 内の Subversion はsvnjavahl.jar、古い 1.6 バージョンの Subversion 作業ディレクトリをおそらく必要とするクライアントを使用しています。一方、チェックアウトした Subvfersion クライアントのバージョンは、新しい1.7 バージョンを使用しています。Eclipse は、JavaHL、SVNKit をインストールするか、コマンド ライン クライアントを使用して、Subversion のチェックアウトを行うことができます。

チェックアウトしたディレクトリのディレクトリ構造を見て、それらの悪名高い.svnディレクトリが各ディレクトリに散らばっているのか、それともルート ディレクトリだけに散らばっているのかを確認してください。ディレクトリが作業ディレクトリのルート ディレクトリの下にのみある場合は.svn、チェックアウトを実行する Subversion の 1.7.x バージョンがあり、Ant が使用している Subversion jar は作業ディレクトリの古い 1.2 から 1.6.x バージョンを必要とします。これらの.svnディレクトリが作業ディレクトリ全体に分散している場合、最初のチェックアウトは古い作業ディレクトリ バージョンを使用しており、Ant は新しいバージョンを使用しています。

したがって、いずれにせよ解決策は次のとおり です。ファイルから Subversion のコミット内容全体を削除しbuild.xmlます。まず第一に、これはビルド ファイルであり、バージョン管理システムで何らかの変更を行うべきではありません。それは悪いフォームです。変更は、ユーザーが意図せずに build.xml ファイルを実行したからではなく、ユーザーが希望する場合にのみ行う必要があります。

次に、派生ビルド出力をリポジトリに保存しないでください。派生したものではなく、ソースのみを保存します。代わりに、Jenkinsのようなビルド システムを使用して、ビルドと配布のビジネス全体を処理してください。

バージョン管理でディストリビューションを保存しても、何の役にも立ちません。配布履歴を見て、どのような変更が加えられたかを理解することはできません。ディストリビューションの 2 つのバージョン間で差分を作成して変更を確認することはできません。あなたが言える最高のことは、それを見つけるのに便利な場所だということです. 問題は、新しいバージョンを作成するたびにディストリビューションに多くのスペースが必要になり、しばらくするとほとんどのスペースが必要なくなることです。Subversion では、それらを簡単に削除する方法がないため、大量のスペースを占有し始めます。

毎日のビルド用に保存している 100Mb の適度な分布があるとします。年間 200 ビルド (週末や休日にはビルドなし) を想定し、年間 2Gb のスペースをリポジトリに追加しているとします。

Jenkins を使用すると、ディストリビューションを Jenkins ビルド内に保存でき、Jenkins は古くて重要でないディストリビューションを自動的に削除します。ディストリビューションは、それを使用したビルドに関連付けられ、ビルド間の違いを確認できます。

しかし、これらのディストリビューションが、他のプロジェクトが必要とする jar ファイルである場合はどうなるでしょうか? Ivyなどの依存関係管理システムと、 NexusArtifactoryなどのローカル Maven リポジトリを使用して管理します。

そこまで行きたくない場合でも、<get/>Jenkins から直接タスクを使用して、必要な jar をプルすることができます。Jenkins は最後の適切なアーティファクト リンクを提供します。これをビルド システムで使用して、必要な jar をプルできます。

お役に立てれば。

于 2013-01-10T15:45:13.673 に答える
0

David は、ivyを使用してサードパーティの依存関係を管理することに言及しました。

この例は、ビルドによって ant-contrib と subversion の両方の依存関係をダウンロードしてキャッシュする方法を示しています。

Subversion の問題については、常に ANT 内で有効にすることが問題であることがわかりました。私が望んでいたのは、純粋な Java アプローチがより堅牢でクロスプラットフォームになることでした。私の解決策はsvnkitで、コマンドライン クライアントを呼び出すマクロを作成しました。

管理された subversion と ant-contrib の依存関係に ivy を使用する方法を示します。依存関係は、cachepathタスクを使用してインラインで宣言されます。複数のクラスパスを管理している場合は、個別のivy.xmlファイルを使用します

Apache Ant(TM) version 1.8.2
Apache Ivy 2.3.0-rc2

build.xml

<project name="build" 
         default="demo-ant-contrib" 
         xmlns:ivy="antlib:org.apache.ivy.ant" 
         xmlns:ac="antlib:net.sf.antcontrib">

    <!--
    ======
    Macros
    ======
    -->
    <macrodef name="svn-checkout">
        <attribute name="src"/>
        <attribute name="dest"/>
        <sequential>
            <mkdir dir="@{dest}"/>
            <java classname="org.tmatesoft.svn.cli.SVN" dir="@{dest}" fork="true" classpathref="build.path">
                <arg value="--non-interactive"/>
                <arg line="--username ${svn.user}"/>
                <arg line="--password ${svn.pass}"/>
                <arg value="checkout"/>
                <arg value="@{src}"/>
            </java>
        </sequential>
    </macrodef>

    <!--
    =======
    Targets
    =======
    -->
    <target name="resolve" description="Resolve 3rd party dependencies">
        <ivy:cachepath pathid="build.path">
            <dependency org="org.tmatesoft.svnkit" name="svnkit-cli" rev="1.7.8" conf="default"/>
            <dependency org="ant-contrib" name="ant-contrib" rev="1.0b3" conf="default"/>
            <exclude org="ant"/>
        </ivy:cachepath>
    </target>

    <target name="checkout" depends="resolve" description="Pull code from SCM repository">
        <svn-checkout src="http://svn.apache.org/repos/asf/subversion/trunk" dest="build/subversion"/>
    </target>

    <target name="demo-ant-contrib" depends="resolve" description="Demonstrate using ant-contrib">
        <taskdef uri="antlib:net.sf.antcontrib" resource="net/sf/antcontrib/antlib.xml" classpathref="build.path"/>

        <ac:for list="a,b,c,d,e" param="letter">
            <sequential>
                <echo>Letter @{letter}</echo>
            </sequential>
        </ac:for>
    </target>

    <target name="clean" description="Cleanup build files">
        <delete dir="build"/>
    </target>

    <target name="clean-all" depends="clean" description="Cleanup and purge ivy cache">
        <ivy:cleancache/>
    </target>

</project>
于 2013-01-10T22:36:39.880 に答える