java - Tomcat 8 无法通过 Ant 脚本部署

标签 java tomcat ant tomcat8

Tomcat 版本:8.0.43

操作系统:Windows 10

我的部署 URL:http://localhost:8080/manager/text

我的用户帐户似乎设置正确,因为我可以正常访问网络用户界面。

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">
    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <user username="user" password="pass" roles="manager-gui,manager-script"/>
</tomcat-users>

当我尝试在浏览器中手动访问该部署 URL 时,我没有遇到任何问题,并且在我的日志中看到了这一点

用户 [08/Oct/2018:12:51:15 -0700] "GET/manager/text/deploy?path=/apc HTTP/1.1"200 69

当我尝试通过 Ant 进行部署时,我收到以下错误和带有 401 未授权 HTTP 代码的日志条目

<target name="deploy" description="Install web application" depends="dist">
    <deploy url="http://localhost:8080/manager/text" username="user" password="pass"
        path="/apc" war="dist/apc.war"/>
</target>


java.io.IOException: Error writing request body to server
        at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(HttpURLConnection.java:3536)
        at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(HttpURLConnection.java:3519)
        at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
        at org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:238)
        at org.apache.catalina.ant.DeployTask.execute(DeployTask.java:194)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
        at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:99)
        at org.apache.tools.ant.Task.perform(Task.java:350)
        at org.apache.tools.ant.Target.execute(Target.java:449)
        at org.apache.tools.ant.Target.performTasks(Target.java:470)
        at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1388)
        at org.apache.tools.ant.Project.executeTarget(Project.java:1361)
        at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
        at org.apache.tools.ant.Main.runBuild(Main.java:834)
        at org.apache.tools.ant.Main.startAnt(Main.java:223)
        at org.apache.tools.ant.launch.Launcher.run(Launcher.java:284)
        at org.apache.tools.ant.launch.Launcher.main(Launcher.java:101)
        Suppressed: java.io.IOException: insufficient data written
                at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.close(HttpURLConnection.java:3558)
                at java.io.FilterOutputStream.close(FilterOutputStream.java:159)
                at org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:241)
                ... 17 more

- [08/Oct/2018:12:52:14 -0700] "PUT/manager/text/deploy?path=%2Fapc HTTP/1.1"401 2473

奇怪的是我的 Undeploy Ant 命令使用相同的用户名和密码工作得很好。因此,如果我手动部署我的 WAR,我可以使用此命令成功取消部署

<target name="undeploy" description="Remove web application">
        <undeploy url="http://localhost:8080/manager/text" username="user" password="pass"
            path="/apc"/>
    </target>

用户 [08/Oct/2018:12:47:34 -0700] "GET/manager/text/undeploy?path=%2Fapc HTTP/1.1"200 61

看来我的用户名和密码是正确的,但无论出于何种原因,部署都无法将其识别为有效

需要注意的一件事是,我成功的手动访问和取消部署尝试的日志条目在条目前面显示了 user。部署不成功的日志条目显示 -。不确定这意味着什么,但可能很重要。

更新: 看来它可能与 tomcat 8 lib 文件有关。目前我在类路径中使用 catalina-ant、tomcat-coyote、tomcat-util JAR 来运行我的 ant 脚本。如果我使用 Tomcat 8 中提供的库,则会出现上述错误。如果我改为使用旧 Tomcat 7 安装中的库,那么它可以正常工作。

最佳答案

已知在 2017-05-30(8.0.45 及更高版本)之后的所有 Tomcat 8.0 版本(8.0.45 及更高版本)中,身份验证支持都被破坏——参见 issue #62809 .

问题 #62809 已在 Tomcat 9.0.13、8.5.35、7.0.92 中修复。它在 Tomcat 8.0 中尚未修复,因为 Tomcat 8.0 已经达到生命周期结束。

供引用:r1796838 , r1843992 .

at java.io.BufferedOutputStream.write(BufferedOutputStream.java:122)
at org.apache.catalina.ant.AbstractCatalinaTask.execute(AbstractCatalinaTask.java:238)

上面的行号不是您声称的来自 Tomcat 8.0.43,而是来自 8.0.45 或更高版本。 在 8.0.43 中,“ostream.write(..)”调用位于 AbstractCatalinaTask 的第 242 行。在 8.0.45+ 中,它位于第 238 行。

关于java - Tomcat 8 无法通过 Ant 脚本部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52746235/

相关文章:

java - 用java制作一个计算器

java - 将 netbeans 中的数据库移动到另一台计算机

tomcat - 如何在 FlexBuilder 上安装 Tomcat 服务器

java - 我的 Android 项目的 Ant 构建问题

ubuntu - ld : "undefined reference to symbol ' sqrtf'"error with G++ via Apache Ant

hibernate - 运行导出器#2:hbm2ddl时发生异常(生成数据库架构)

java - 依赖策略

java - JPopupMenu 中的多个 JCheckBoxMenuItem 选择

java - 线程 “main” java.util.zip.ZipException : error in opening zip file 中的异常

eclipse - 在 Eclipse 上设置外部 Tomcat(使用 CATALINA_HOME/CATALINA_BASE 配置)