2013-06-04 32 views
6

私は、コマンドラインでうまく動作するAnt build.xmlファイルを持っています。コンパイルしてJARをビルドします.JARからmainメソッドを実行することができます。 build.xmlファイルは、ここやそこに散在する第三者のライブラリを参照しています。 JARを構築するとき、スクリプトはJAR自体にすべての第三者のライブラリを含むわけではありません。代わりに、そのパスをJARのマニフェストに入れます。これは私のJARをスリムできれいに保つのに役立ちます。EclipseでAntのクラスパスを使用する

私はEclipseでプロジェクトを編集してデバッグできるようにしたいと思いますが、簡単な方法はありません。私のプロジェクトでAntファイルを使ってプロジェクトをビルドすることができます。それはうまくいくようです。しかし、Eclipseはサードパーティするライブラリを見つけるの問題を抱えているため、Eclipseは二つの問題持っている:クラスの 多くが定義されていないので、コンパイルエラーがたくさん(テキストエディタで)

  1. それはショーを、そして
  2. JARを実行することはできません。

Iは、2つの差の場所で、手で指定することにより、上記の問題の両方を解決することができる(すなわち、Properties->Java Build Path->Libraries介してビルド・パス、およびRun Configurations->Classpath介して実行クラスパス)、すべてのサードパーティのライブラリ。しかし、私はJARのマニフェストにすべてのサードパーティのライブラリが既にリストされているので、手動で行う必要はないようです。私は間違って何をしていますか?

ここに私のbuild.xmlファイルです:

<!-- Set global properties for this build --> 
<property name="src"   location="./src" /> 
<property name="build"  location="./build"/> 
<property name="dist"  location="./dist"/> 
<property name="logs"  location="./logs"/> 
<property name="docs"  location="./docs"/> 
<property name="jar"   location="${dist}/dynamic_analyzer.jar"/> 
<property name="lib"   location="../../thirdparty/lib"/> 
<property name="hive-util" location="../../hive-utils/dist"/> 
<property name="hpdb"  location="../../hive-db/hpdb/dist"/> 
<property name="static"  location="../../hive-backend/static_analyzer/dist"/> 
<property name="mainclass" value="com.datawarellc.main.DynamicMain"/> 

<path id="dep.runtime"> 
    <fileset dir="${lib}"  includes="**/*.jar"/> 
    <fileset dir="${hive-util}" includes="**/*.jar"/> 
    <fileset dir="${hpdb}"  includes="**/*.jar"/> 
    <fileset dir="${static}" includes="**/*.jar"/> 
</path> 

<target name="clean"> 
    <delete dir="${build}"/> 
    <delete dir="${dist}"/> 
    <delete dir="${docs}"/> 
    <delete dir="${logs}"/> 
</target> 

<target name="init"> 
    <tstamp/> 
    <mkdir dir="${build}"/> 
    <mkdir dir="${dist}"/> 
    <mkdir dir="${logs}"/> 
</target> 

<target name="compile" depends="init"> 
    <javac srcdir="${src}" destdir="${build}" debug="on" includeantruntime="false"> 
     <classpath refid="dep.runtime" /> 
    </javac> 

    <!-- Debug output of classpath --> 
    <property name="myclasspath" refid="dep.runtime"/> 
    <echo message="Classpath = ${myclasspath}"/> 

</target> 

<target name="jar" depends="compile"> 
    <!-- Put the classpath in the manifest --> 
    <manifestclasspath property="manifest_cp" jarfile="${jar}" maxParentLevels="10"> 
     <classpath refid="dep.runtime" /> 
    </manifestclasspath> 

    <jar jarfile="${jar}" basedir="${build}"> 
     <manifest> 
      <attribute name="Main-Class" value="${mainclass}"/> 
      <attribute name="Class-Path" value="${manifest_cp}"/> 
     </manifest> 
     <zipfileset dir="${src}" includes="**/*.xml" /> 
    </jar> 
</target> 

あなたは、私はいくつかのディレクトリ(${lib}${hive-util}${hpdb}、および${static})で、サードパーティのライブラリを持っていることがわかりますが。私はdep.runtimeと呼ばれるpathを作成するためにこれらを使用します。私はその後、私の瓶を作るときにマニフェストにdep.runtimeを含めます。 実行時にビルドパスとクラスパスに同じdep.runtimeを使用するにはどうすればよいですか?

+0

ここにマニュアルを確認してください:http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fpreferences% 2Fjava%2Fbuildpath%2Fref-preferences-user-libraries.htm (私はこれを答えにしていますが、Eclipseのインストールは手元にありません) – leeand00

+0

@ leeand00どのようにドキュメントが私を助けているのかわかりません。リンクが話すメニューは、(一時的な回避策として)私が手動ですべてのサードパーティのライブラリを手動で追加するために使用しているメニューですが、それは私が避けようとしているものです。 – stepthom

+0

そこに 'add directory'または' classpath'を追加するボタンがあるはずです。トリックをする必要があります...そうでない場合は教えてください。 – leeand00

答えて

2

@ leeand00が提供するリンクに触発されて、次の回避策を思いつきました。

まず、Eclipseで使用されている.classpathファイルを生成する単純なPerlスクリプト(genClasspath.pl)を書きました。

<target name="compile" depends="init"> 
    <javac srcdir="${src}" destdir="${build}" debug="on" includeantruntime="false"> 
     <classpath refid="dep.runtime" /> 
    </javac> 

    <property name="myclasspath" refid="dep.runtime"/> 

    <exec dir="." executable="../../scripts/genClasspath.pl" os="Linux"> 
     <arg value=".classpath"/> 
     <arg value="${myclasspath}"/> 
    </exec> 

</target> 

唯一の難点は、私は少なくとも一度私が開く前に、コマンドラインでのAntを実行する必要があるということです。そして、

#!/usr/bin/perl 
use strict; 

if (@ARGV != 2) { 
    print STDERR "Usage: $0 OUTFILE CLASSPATHSTRING\n"; 
    print STDERR "e.g., $0 .classpath path1:path2:path3\n"; 
    exit 1; 
} 

my $OUTFILE   = $ARGV[0]; 
my $CLASSPATHSTRING = $ARGV[1]; 

open my $out_fh, '>', $OUTFILE or die "Couldn't open output file: $!"; 

print $out_fh q{<?xml version="1.0" encoding="UTF-8"?> 
<classpath> 
    <classpathentry kind="src" path="src"/> 
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> 
    <classpathentry kind="output" path="build"/> 
}; 

my @libs = split(":", $CLASSPATHSTRING); 
foreach my $thisLib (@libs){ 
    print $out_fh " <classpathentry kind=\"lib\" path=\"$thisLib\"/>\n"; 
} 
print $out_fh "</classpath>\n"; 

は、私は私のbuild.xmlファイルの呼び出しdep.runtimeの内容で、このスクリプトを持っていますEclipseのプロジェクトしかし、私がすると、クラスパスはAntのものとまったく同じなので、Eclipseはプロジェクトをコンパイルして実行することができます。

+2

Mavenにはこの機能が備わっていることに注意してください。私はそれがおそらくオプションではないことを認識しているので、答えではなくコメントを残していますが、MavenはEclipseプロジェクトファイルを生成でき、m2eをインストールしたEclipseは依存関係を変更すると自動的にクラスパスエントリを追加します。 – davidfmatheson

+0

@davidfmathesonは正しいですが(あなたの質問アドレスの蟻なので、私は一緒に行ったことです...) – leeand00

3

perlへの代替は、埋め込まれたgroovy taskを使用することです:

<project name="demo" default="eclipse-files"> 

    <property name="src.dir"  location="src"/> 
    <property name="classes.dir" location="build/classes"/> 

    <path id="dep.runtime"> 
     <fileset dir="${lib}"  includes="**/*.jar"/> 
     <fileset dir="${hive-util}" includes="**/*.jar"/> 
     <fileset dir="${hpdb}"  includes="**/*.jar"/> 
     <fileset dir="${static}" includes="**/*.jar"/> 
    </path> 

    <target name="bootstrap"> 
     <mkdir dir="${user.home}/.ant/lib"/> 
     <get dest="${user.home}/.ant/lib/groovy-all.jar" src="http://search.maven.org/remotecontent?filepath=org/codehaus/groovy/groovy-all/2.1.4/groovy-all-2.1.4.jar"/> 
    </target> 

    <target name="eclipse-files"> 
     <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/> 
     <groovy> 
      import groovy.xml.MarkupBuilder 

      project.log "Creating .classpath" 

      new File(".classpath").withWriter { writer -> 
       def xml = new MarkupBuilder(writer) 

       xml.classpath() { 
        classpathentry(kind:"src", path:properties["src.dir"]) 
        classpathentry(kind:"output", path:properties["classes.dir"]) 
        classpathentry(kind:"con", path:"org.eclipse.jdt.launching.JRE_CONTAINER") 

        project.references."dep.runtime".each { 
         classpathentry(kind:"lib", path:it) 
        } 
       } 
      } 
     </groovy> 
    </target> 

    <target name="clean"> 
     <delete file=".classpath"/> 
    </target> 

</project> 

注:

  • ブートストラップターゲットは、グルーヴィーなjarファイル(perlの上ノー依存)
  • Groovyのサードパーティをダウンロードします"dep.runtime" ANTパスに直接アクセスしてその内容を繰り返し処理することができます。
  • GroovyはXMLファイルの作成に優れています。

次の回答は似ていて、さらにEclipseの.projectファイルを生成します。

+0

+1かなりクールなアプローチ。私はGroovyの専門家ではありませんが、All-Antソリューションを持つのはいいことです。 – stepthom

+0

私はあなたの代わりに私の答えを受け入れました。なぜなら、私にとっては、Groovyの利点にもかかわらず、Perlを使うのが簡単だからです。しかし、私は多くの人があなたの解決策をちょうど良いものとして見つけ出すと考えています。 – stepthom

関連する問題