2012-07-06 35 views
2

我試圖用Ant來編譯jsoup源代碼。我可以成功編譯,但無法通過測試。這裏是過程:如何通過Ant編譯jsoup?

jsoup版本:1.6.3;螞蟻版本:1.8.2

jsoup的源目錄

src/ 

我做了一個構建文件

src/build.xml 

此文件包含

<project name="jsoup"> 
<target name="compile"> 
    <mkdir dir="build/classes"/> 
    <javac srcdir="src" destdir="build/classes" includeantruntime="false"/> 
</target> 

<target name="jar"> 
    <mkdir dir="build/jar"/> 
    <jar destfile="build/jar/jsoup.jar" basedir="build/classes"> 
     <manifest> 
      <attribute name="Main-Class" value="StateTrace"/> 
     </manifest> 
    </jar> 
</target> 

<target name="run"> 
    <!--<java jar="build/jar/jsoup.jar" input="htmls/index.html" fork="true"/>--> 
    <exec executable="java"> 
     <arg value="-jar"/> 
     <arg value="build/jar/jsoup.jar"/> 
     <arg value="htmls/index.html"/> 
    </exec> 
</target> 
</project> 

注: 1. StateTrace.java是我自己的測試程序(如下); 2. htmls/index.html是StateTrace.java的輸入。

String html; // contains the content in htmls/index.html 
... 
try{ 
    Document doc = Jsoup.parse(html); 
}catch(IOException e){e.printStackTrace();} 

然後我編譯和使用Ant運行:

> ant compile 
> ant jar 
> ant run 

在此之後,我有犯錯,如:

run: 
[exec] Exception in thread "main" java.lang.ExceptionInInitializerError 
[exec]  at org.jsoup.nodes.Entities$EscapeMode.<clinit>(Unknown Source) 
[exec]  at org.jsoup.nodes.Document$OutputSettings.<init>(Unknown Source) 
[exec]  at org.jsoup.nodes.Document.<init>(Unknown Source) 
[exec]  at org.jsoup.parser.TreeBuilder.initialiseParse(Unknown Source) 
[exec]  at org.jsoup.parser.TreeBuilder.parse(Unknown Source) 
[exec]  at org.jsoup.parser.HtmlTreeBuilder.parse(Unknown Source) 
[exec]  at org.jsoup.parser.Parser.parse(Unknown Source) 
[exec]  at org.jsoup.Jsoup.parse(Unknown Source) 
[exec]  at StateTrace.main(Unknown Source) 
[exec] Caused by: java.lang.NullPointerException 
[exec]  at java.util.Properties$LineReader.readLine(Properties.java:418) 
[exec]  at java.util.Properties.load0(Properties.java:337) 
[exec]  at java.util.Properties.load(Properties.java:325) 
[exec]  at org.jsoup.nodes.Entities.loadEntities(Unknown Source) 
[exec]  at org.jsoup.nodes.Entities.<clinit>(Unknown Source) 
[exec]  ... 9 more 
[exec] Result: 1 

BUILD SUCCESSFUL 
Total time: 0 seconds 

但是,如果我手動編譯所有的Java源代碼,像

javac src/org/jsoup/*.java src/org/jsoup/parser/*.java src/org/jsoup/examples/*.java src/org/jsoup/nodes/*.java src/org/jsoup/safety/*.java src/org/jsoup/select/*.java src/org/jsoup/helper/*.java 

我可以com成功堆積並通過我的測試。

任何線索?謝謝!

+1

恐怕你的問題沒有包含足夠的當前形式的信息。 build.xml不適用於最新版本的ant(例如1.8.2)以及htmls/index.html中的內容?你使用的是最新版本的jsoup源代碼(1.6.3)嗎? StateTrace不是jsoup的一部分 - 這是你自己的代碼嗎?我很高興看到你的問題,但我需要足夠的信息來重現它。 – richj 2012-07-07 00:35:12

+0

@richj謝謝你的問題。你是對的。讓我提供更多信息。請參閱問題的更新版本。 – JackWM 2012-07-07 13:57:34

+0

感謝您的額外信息。請在StateTrace.main中添加代碼行(...)調用Jsoup.parse(...)。我特別感興趣的是發送給html和[可選] baseUri參數的值。謝謝。 – richj 2012-07-09 12:28:04

回答

0

這build.xml文件可與螞蟻1.8.2:

<?xml version="1.0"?> 
<project name="jsoup"> 
    <target name="compile"> 
     <mkdir dir="build/classes"/> 
     <javac srcdir="src" destdir="build/classes" includeantruntime="false"/> 
    </target> 

    <target name="jar"> 
     <mkdir dir="build/jar"/> 
     <jar destfile="build/jar/jsoup.jar" basedir="build/classes"> 
      <manifest> 
       <attribute name="Main-Class" value="org.jsoup.examples.HtmlToPlainText"/> 
      </manifest> 
     </jar> 
    </target> 

    <target name="run"> 
     <!--<java jar="build/jar/jsoup.jar" input="htmls/index.html" fork="true"/>--> 
     <exec executable="java"> 
      <arg value="-jar"/> 
      <arg value="build/jar/jsoup.jar"/> 
      <arg value="htmls/index.html"/> 
     </exec> 
    </target> 
</project> 

...等待更多的信息.​​.. ... ,直到它變成了,我的猜測是沒有文件at htmls/index.html

+0

我剛剛使用了您提供的build.xml(我將「htmls/index.html」替換爲一個真實的url)。但我得到了同樣的錯誤。 – JackWM 2012-07-07 14:21:45

0

我沒有找到此錯誤的根本原因。但我終於做到了。

看來類文件需要保存在源文件的相同目錄中。所以一個build.xml是這樣的:

<project> 
<target name="compile"> 
    <mkdir dir="build/classes"/> 
    <javac srcdir="src" destdir="src" includeantruntime="false"/> 
</target> 

<target name="clean"> 
    <delete dir="build"/> 
</target> 

<target name="jar"> 
    <mkdir dir="build/jar"/> 
    <jar destfile="build/jar/jsoupIns.jar" basedir="src"> 
     <manifest> 
      <attribute name="Main-Class" value="org.jsoup.examples.HtmlToPlainText"/> 
     </manifest> 
    </jar> 
</target> 

<target name="run"> 
    <!--<java jar="build/jar/jsoup.jar" destdir="build/classes" input="htmls/index.html" fork="true"/>--> 
    <exec executable="java"> 
     <arg value="-jar"/> 
     <arg value="build/jar/jsoupIns.jar"/> 
     <arg value="http://www.google.com"/> 
    </exec> 
</target> 
</project> 

如果你知道這個問題的深層原因是任何線索,請讓我知道。謝謝!

0

jar文件需要在jar目錄org/jsoup/nodes中包含文件entities-base.properties和entities-full.properties。將文件集添加到ant jar任務以包含這些文件就足夠了。

<target name="local.all.build" > 

    <echo message="Building ${local.app.jar.name}" /> 
    <mkdir dir="${top.dirs.class}"/> 
    <mkdir dir="${top.dirs.jar}"/> 

    <javac srcdir   = "${local.dirs.source}" 
      destdir   = "${top.dirs.class}" 
      debug    = "true" 
      includeantruntime = "false" > 
     <classpath refid="top.app.classpath"/> 
     <compilerarg value="-Xlint:unchecked" /> 
    </javac> 

    <jar jarfile = "${top.dirs.jar}/${local.app.jar.name}" 
     basedir = "${top.dirs.class}" > 
     <fileset dir  = "${top.dirs.source}" 
       includes = "**/*.properties" /> 
    </jar> 

</target>