【问题标题】:How to compile jsoup through Ant?如何通过Ant编译jsoup?
【发布时间】:2012-07-07 09:45:10
【问题描述】:

我尝试使用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

我可以成功编译并通过我的测试。

有什么线索吗?谢谢!

【问题讨论】:

  • 恐怕您的问题在当前形式中没有包含足够的信息。 build.xml 不适用于最新版本的 ant(例如 1.8.2)以及 htmls/index.html 中的内容?你用的是最新版的jsoup源码(1.6.3)吗? StateTrace 也不是 jsoup 的一部分 - 这是您自己的代码吗?我很高兴看到您的问题,但我需要足够的信息来重现它。
  • @richj 感谢您的提问。你说得对。让我提供更多信息。请查看问题的更新版本。
  • 感谢您提供额外信息。请在 StateTrace.main(...) 中添加调用 Jsoup.parse(...) 的代码行。我对发送到 html 和 [可选] baseUri 参数的值特别感兴趣。谢谢。
  • @richj 我更新了这个问题。 Jsoup 库的调用非常简单。我也试过 Jsoup.connect(url).get()。但同样的错误。
  • 我可以重现您的问题。从 IDE 运行一切都很好,从 ant 执行 jar 失败并带有相同的堆栈跟踪。到目前为止,我发现两者之间的唯一区别是 jar 包含六个 package-info.class 文件 - 和预期的通常的 jar 文件 meta-inf 文件。

标签: java ant build compilation jsoup


【解决方案1】:

此 build.xml 适用于 ant 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>

...等待更多信息... ...在它出现之前,我的猜测是 htmls/index.html 中没有文件

【讨论】:

  • 我刚刚使用了您提供的 build.xml(我将“htmls/index.html”替换为真实的 url)。但我遇到了同样的错误。
【解决方案2】:

我没有找到这个错误的根本原因。但我最终还是成功了。

似乎类文件需要保存在源文件的相同目录中。所以一个 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>

如果您知道此问题的深层原因的任何线索,请告诉我。谢谢!

【讨论】:

    【解决方案3】:

    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>
    

    【讨论】:

      猜你喜欢
      • 2012-01-03
      • 2013-06-04
      • 2013-07-03
      • 1970-01-01
      • 2014-07-05
      • 2017-05-25
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多