Apache Tika Server v2未暴露/async与/pipes端点问题求助
问题描述
希望通过Tika Server接入S3源/目标URL,实现异步解析多种文件类型。已通过Docker在本地启动2.9.2版本的Tika Server,但访问/async或/pipes端点均返回404,主页也未显示对应路由。怀疑是端点未显式暴露、依赖JAR未加载或配置文件存在问题,以下是相关配置及命令,寻求排查建议:
tika-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <properties> <parsers> <parser class="org.apache.tika.parser.DefaultParser"> </parser> </parsers> <server> <params> <enableUnsecureFeatures>true</enableUnsecureFeatures> </params> </server> <pipes> <params> <tikaConfig>./config/tika-config.xml</tikaConfig> </params> </pipes> <async> <params> <timeoutMillis>1000000</timeoutMillis> </params> </async> <fetchers> <fetcher class="org.apache.tika.pipes.fetcher.s3.S3Fetcher"> <params> <name>s3f</name> <region>us-east-1</region> <bucket>tika-bucket</bucket> <credentialsProvider>instance</credentialsProvider> <spoolToTemp>false</spoolToTemp> <extractUserMetadata>false</extractUserMetadata> <maxConnections>100</maxConnections> </params> </fetcher> </fetchers> <emitters> <emitter class="org.apache.tika.pipes.emitter.s3.S3Emitter"> <params> <param name="name" type="string">s3e</param> <param name="region" type="string">us-east-1</param> <param name="credentialsProvider" type="string">instance</param> <param name="bucket" type="string">tika-bucket</param> <param name="fileExtension" type="string">json</param> <param name="spoolToTemp" type="bool">true</param> </params> </emitter> </emitters> </properties>
Dockerfile
FROM ubuntu:focal as base RUN apt-get update ENV TIKA_VERSION 2.9.2 ENV TIKA_SERVER_JAR tika-server-standard FROM base as dependencies RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get -y install gdal-bin tesseract-ocr \ tesseract-ocr-eng curl gnupg # Set this environment variable if you need to run OCR ENV OMP_THREAD_LIMIT=1 RUN apt-get -y install openjdk-17-jdk FROM dependencies as fetch_tika # download all the tika dependencies (removed those lines of code for this question) ENV TIKA_VERSION=$TIKA_VERSION RUN mkdir /tika-bin COPY --from=fetch_tika /${TIKA_SERVER_JAR}-${TIKA_VERSION}.jar /tika-bin/${TIKA_SERVER_JAR}-${TIKA_VERSION}.jar # The extra dependencies need to be added into tika-bin together with the tika-server jar COPY --from=fetch_tika /tika-fetcher-s3-${TIKA_VERSION}.jar /tika-bin/tika-fetcher-s3-${TIKA_VERSION}.jar COPY --from=fetch_tika /tika-emitter-s3-${TIKA_VERSION}.jar /tika-bin/tika-emitter-s3-${TIKA_VERSION}.jar RUN mkdir /config COPY tika-config.xml /config EXPOSE 9998 ENTRYPOINT [ "/bin/sh", "-c", "exec java -cp \"/tika-bin/*\" org.apache.tika.server.core.TikaServerCli -h 0.0.0.0 $0 $@"]
构建运行命令
docker build --tag 'tika_server_local' . docker run -d \ --name tika_container \ -v tika_dir:/config \ -p 9998:9998 tika_server_local:latest \ -c ./config/tika-config.xml
排查建议
1. 补全核心依赖JAR包
Tika的异步(Async)和管道(Pipes)功能需要额外的核心模块支撑,仅现有JAR包不足以激活对应端点,需确保以下JAR包存在于/tika-bin目录:
tika-pipes-core-${TIKA_VERSION}.jartika-server-async-${TIKA_VERSION}.jartika-server-pipes-${TIKA_VERSION}.jar- 配套的基础依赖(如
tika-core、tika-parser-api等,建议通过官方Maven仓库下载完整依赖链)
2. 修正Dockerfile的依赖复制逻辑
当前fetch_tika阶段的COPY --from=fetch_tika属于自引用,无法正确获取下载的JAR包。需调整镜像构建阶段的复制逻辑,示例如下:
FROM dependencies as fetch_tika # 补充下载命令,获取所有必需JAR RUN curl -LO https://repo1.maven.org/maven2/org/apache/tika/tika-server-standard/${TIKA_VERSION}/tika-server-standard-${TIKA_VERSION}.jar RUN curl -LO https://repo1.maven.org/maven2/org/apache/tika/tika-pipes-core/${TIKA_VERSION}/tika-pipes-core-${TIKA_VERSION}.jar RUN curl -LO https://repo1.maven.org/maven2/org/apache/tika/tika-server-async/${TIKA_VERSION}/tika-server-async-${TIKA_VERSION}.jar RUN curl -LO https://repo1.maven.org/maven2/org/apache/tika/tika-server-pipes/${TIKA_VERSION}/tika-server-pipes-${TIKA_VERSION}.jar RUN curl -LO https://repo1.maven.org/maven2/org/apache/tika/tika-fetcher-s3/${TIKA_VERSION}/tika-fetcher-s3-${TIKA_VERSION}.jar RUN curl -LO https://repo1.maven.org/maven2/org/apache/tika/tika-emitter-s3/${TIKA_VERSION}/tika-emitter-s3-${TIKA_VERSION}.jar # 构建最终镜像 FROM dependencies as final RUN mkdir /tika-bin COPY --from=fetch_tika /tika-server-standard-${TIKA_VERSION}.jar /tika-bin/ COPY --from=fetch_tika /tika-pipes-core-${TIKA_VERSION}.jar /tika-bin/ COPY --from=fetch_tika /tika-server-async-${TIKA_VERSION}.jar /tika-bin/ COPY --from=fetch_tika /tika-server-pipes-${TIKA_VERSION}.jar /tika-bin/ COPY --from=fetch_tika /tika-fetcher-s3-${TIKA_VERSION}.jar /tika-bin/ COPY --from=fetch_tika /tika-emitter-s3-${TIKA_VERSION}.jar /tika-bin/ RUN mkdir /config COPY tika-config.xml /config EXPOSE 9998 ENTRYPOINT [ "/bin/sh", "-c", "exec java -cp \"/tika-bin/*\" org.apache.tika.server.core.TikaServerCli -h 0.0.0.0 $0 $@"]
3. 优化配置文件
- 移除
<pipes>节点中的tikaConfig参数,当前配置文件已被Tika加载,无需重复指定路径 - 确认容器内
./config/tika-config.xml路径可访问:若使用卷挂载,需确保本地tika_dir目录下存在该文件;也可直接将配置文件复制到镜像内,避免挂载路径问题
修正后的<pipes>节点示例:
<pipes> <params> <!-- 移除重复的tikaConfig配置 --> </params> </pipes>
4. 查看启动日志排查错误
暂时取消docker run的-d后台模式,前台启动容器查看日志:
docker run --name tika_container -v tika_dir:/config -p 9998:9998 tika_server_local:latest -c ./config/tika-config.xml
重点关注是否存在ClassNotFoundException(依赖缺失)、配置文件语法错误等提示。
5. 验证端点注册状态
若依赖加载正常,启动日志会显示类似Registered resource: /async或Registered resource: /pipes的信息。如果没有此类日志,说明对应模块未成功加载,需重新检查依赖包完整性。
内容的提问来源于stack exchange,提问作者canpan14
相关产品推荐
相关产品推荐

