现在主流的项目都使用maven来构建了,还在使用ant的项目应该是比较老旧了,现在因为需要调试zookeeper的源码,所以需要用到ant。使用时遇到点问题,借此记录一下爬坑过程。

1. 问题复现

IDE使用的是Intellij idea,因此使用的是它自带的ant插件,导入zookeeper源码,点开ant界面,Run Target->compile,然后就出现如下错误:

Error getting https://repo1.maven.org/maven2/org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar to C:\workspace\zookeeper-3.4.13\src\java\lib\ivy-2.4.0.jar
C:\workspace\zookeeper-3.4.13\build.xml:392: java.net.ConnectException: Connection timed out: connect

zookeeper需要用ivy.jar,下载ivy.jar失败。
因为使用的是公司网络,看到这个错误,第一反应就是没有配置代理。另外,IDEA的系统设置里面,HTTP代理已设置,执行ant并未生效,说明它没去读IDEA的配置。于是,查看ant官网https://ant.apache.org/manual/index.html, 如何配置代理。

ant官网提供了几种设置代理的方式,针对IDEA的ant插件,比较合适的是手动设置JVM参数。增加如下参数即可:

-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080

现在问题来了,上面的参数配置到哪里呢?

2. 设置代理

一番摸索,发现在ant面板上,有一个 Properties 的标签,点击该标签,会弹出配置参数的界面,也可右键ant面板上的任意target命令,如下:
在这里插入图片描述
上图中的各个参数,都可在IDEA官网中找到解释(点击上图中左下角的问号图标,即可打开)。

通过官网介绍,符合条件的应该就是 Ant command line, 点击 Execution 标签,可看到如下界面:
在这里插入图片描述
注意文本框下面的那行小字 Use “-J” prefix to specify JVM arguments ,这个在官网的说明里面没有描述,所以我看到这个时有点疑惑,到底该如何添加呢?一顿瞎操作之后,都没蒙对组合方式。
比如:-Jhttps.proxyHost=1.1.1.1,执行Run,报错如下:

Error: Could not find or load main class https.proxyHost=1.1.1.1


Ant build completed with one error and no warnings in 0s at 2022/3/24 15:14

不想瞎猜了,同时也想搞清楚它是如何解析参数的,所以最后去下载了IDEA的源码。
IDEA的源码很大,又该从哪里入手呢?这里就通过搜关键字来找源码了,简单粗暴一点就是直接搜 Ant 关键字,但这样搜出来的源文件还是比较多,需要挨个确认。我们可以再使用精确一点关键字,这个关键字又是什么呢?

留意一下Ant build的时候的输出信息(输出到IDEA的 Messages 窗口里),如下:

"C:\Program Files\AdoptOpenJDK\jdk-8.0.292.10-hotspot\bin\java.exe
 -Xmx512m -Xss2m
 -Dant.home=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant" "
 -Dant.library.dir=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib" 
 -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-antlr.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-bcel.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-bsf.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-log4j.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-oro.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-regexp.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-resolver.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-xalan2.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-commons-logging.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-commons-net.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-jai.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-javamail.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-jdepend.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-jmf.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-jsch.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-junit.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-junit4.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-junitlauncher.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-launcher.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-netrexx.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-swing.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-testutil.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-xz.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant.jar;C:\Program Files\AdoptOpenJDK\jdk-8.0.292.10-hotspot\lib\tools.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\idea_rt.jar" com.intellij.rt.ant.execution.AntMain2 -logger com.intellij.rt.ant.execution.IdeaAntLogger2 -inputhandler com.intellij.rt.ant.execution.IdeaInputHandler -buildfile C:\workspace\zookeeper-3.4.13\build.xml compile
build.xml
init
ivy-download
Getting: https://repo1.maven.org/maven2/org/apache/ivy/ivy/2.4.0/ivy-2.4.0.jar
To: C:\workspace\zookeeper-3.4.13\src\java\lib\ivy-2.4.0.jar

通过上述日志,可以看到,Ant build 的时候,传入了 Ant 相关的JVM参数。我们在文本框输入的http代理,最终也会在该命令行里面输出。因此,通过这些参数来定位源码,会大幅缩减源码文件。
在这里插入图片描述
上图就是搜出来的结果,共三个源文件。从名字和相关代码来看,AntCommandLineBuilder 比较像是所用到的源码(没有进一步跟踪,所以,不能确定)。
同时,为了保证正确性,对比了 AntCommandLineBuilderAntArtifactBuildTaskProvider 两个文件,针对 -J 参数都做了相同的解析。源码如下:

    final String additionalParams = AntBuildFileImpl.ANT_COMMAND_LINE_PARAMETERS.get(container);
    if (additionalParams != null) {
      for (String param : ParametersList.parse(additionalParams)) {
        if (param.startsWith("-J")) {
          final String cutParam = param.substring("-J".length());
          if (cutParam.length() > 0) {
            vmParametersList.add(cutParam);
          }
        }
        else {
          programParameters.add(param);
        }
      }
    }

由上述代码可以看到,-J 前缀会被截取丢掉,只读取后面的字符串。 所以,下面可以放心大胆的给出结论了。
输入参数格式如下:

-J-Dhttps.proxyHost=1.1.1.1 -J-Dhttps.proxyPort=8080

-J 参数之间使用空格隔开,这个在IDEA官网文档也有提到。

注意:上面传入的是 https 的代理,因为maven库的url使用的是 https ,如果传入 http 的代理,则会报连接超时的错误(Connection timed out: connect),和开始提到的错误一样。

3. 重新运行

代理设置完成之后,重新Run target,可看到Ant Build信息里面,命令行已经包含了刚才设置的代理,见下:

"C:\Program Files\AdoptOpenJDK\jdk-8.0.292.10-hotspot\bin\java.exe"  
 -Dhttps.proxyHost=1.1.1.1
 -Dhttps.proxyPort=8080
 -Xmx512m -Xss2m
 -Dant.home=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant
 -Dant.library.dir=C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib
 -Dfile.encoding=UTF-8 -classpath "C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-antlr.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-bcel.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-bsf.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-log4j.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-oro.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-regexp.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-resolver.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-apache-xalan2.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-commons-logging.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-commons-net.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-jai.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-javamail.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-jdepend.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-jmf.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-jsch.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-junit.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-junit4.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-junitlauncher.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-launcher.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-netrexx.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-swing.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-testutil.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant-xz.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\ant\lib\ant.jar;C:\Program Files\AdoptOpenJDK\jdk-8.0.292.10-hotspot\lib\tools.jar;C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2021.1.3\lib\idea_rt.jar" com.intellij.rt.ant.execution.AntMain2 -logger com.intellij.rt.ant.execution.IdeaAntLogger2 -inputhandler com.intellij.rt.ant.execution.IdeaInputHandler -buildfile C:\workspace\zookeeper-3.4.13\build.xml compile
build.xml
init
ivy-download

ivy 下载成功,说明代理设置生效。

4. 总结

  • 编译过程中,老是会遇到各种各样的问题。但仔细查看错误信息,会发现大多问题都体现在日志里面。
  • 下载源码编译的时候,尽量先阅读官网的相关说明,通常官网都会明确告知需要依赖哪些资源库等信息,这样可以减少错误的发生。
  • 遇到问题时,搜索的关键字很重要,关键字不准确,那么显示的结果也就鱼龙混杂,此时需要带着疑问去尝试,可以排除很多不正确的方案。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐