如何在 Google Cloud 上運行 IronPDF for Java

This article was translated from English: Does it need improvement?
Translated
View the article in English

將 IronPDF for Java 部署在 Google Cloud Functions 需要非預設配置,因為 IronPDF 依賴捆綁的 Chromium 二進制來將 HTML 渲染成 PDF。 本指南涵蓋了在 Google Cloud Functions 中運行 IronPDF 所需的一切資訊——從正確的 pom.xml 依賴到運行時的權限和資源設置。

重要IronPDF for Java 在 Google Cloud 的支持目前是實驗性的——並非所有配置在每個地區或運行時版本中都經過驗證。 在上線之前徹底測試部署。

如果您已經熟悉 Google Cloud Functions 和 Docker,這不是問題。 配置更改很簡單:用自定義 Dockerfile 替換預設的函式映像,新增 Linux 引擎依賴,調整資源限制,並設置工作目錄。 下面將解釋每個步驟。

快速入門:在 Google Cloud 上部署 IronPDF for Java

最小的工作配置需要一個自定義的 Dockerfile(因為預設的雲函式映像缺少 Chrome 的系統依賴)、在您的 pom.xml 中的 ironpdf-engine-linux-x64 工件和指向 /tmp/ 的工作目錄。 下面的程式碼展示了如何在您的函式入口點設置引擎工作目錄:

:path=/static-assets/pdf/content-code-examples/tutorials/google-cloud/configure-working-directory.java
import com.ironsoftware.ironpdf.Settings;
import java.nio.file.Paths;

// Point IronPDF at a writable directory in the Cloud Function runtime
Settings.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
JAVA

設置工作目錄後,IronPDF 可以在雲函式的臨時文件系統中提取並運行其引擎二進制文件。 /tmp/ 目錄是在大多數 Google Cloud Function 運行時中可用的唯一可寫、可執行的路徑。

目錄

為什麼預設的雲函式映像無法工作?

預設的 Google Cloud Function 運行時映像設計為最小化——其中僅包括執行用常見語言編寫的函式程式碼所需的包。 IronPDF 的基於 Chromium 的渲染引擎依賴於更廣泛的一組 Linux 系統庫(字體、圖形庫、沙箱工具),這些在標準映像中缺失。

Google 發布了每個運行時可用系統包的完整列表,位於 Google Cloud Functions 系統包參考。 Chromium 的依賴在任何標準的二代運行時中均不包含。 嘗試在預設映像中載入 IronPDF 引擎會導致啟動時本機庫載入失敗。

解決方案是構建一個自定義 Docker 映像,在新增函式二進制之前明確安裝這些包。 此方法完全支持 Google Cloud Functions,並且是任何需要本機二進制的函式推薦的策略。 請參閱 IronPDF Linux 部署指南 以瞭解應包括的完整包列表。

請注意Zip 部署不支持 Google Cloud 上的 IronPDF。 IronPDF 必須在運行時提取並執行本機二進制,這需要可寫的文件系統和執行權限,而這是 Zip 部署模型所不提供的。

如何為 Google Cloud 構建自定義 Dockerfile?

自定義的 Dockerfile 提供對運行環境的完全控制。 從官方的 Google Cloud Functions Java 基礎映像開始,然後安裝 Chromium 需要的系統庫。

下面的 Dockerfile 示範了推薦的模式。 用您函式專案的具體內容替換 COPYCMD 條目:

//:path=Dockerfile
# Use the official Google Cloud Functions Java 17 base image
FROM gcr.io/google-appengine/java17:latest

# Install Chrome system dependencies required by IronPDF's rendering engine
RUN apt-get update && apt-get install -y \
    libglib2.0-0 \
    libnss3 \
    libatk1.0-0 \
    libatk-bridge2.0-0 \
    libcups2 \
    libdrm2 \
    libxkbcommon0 \
    libxcomposite1 \
    libxdamage1 \
    libxfixes3 \
    libxrandr2 \
    libgbm1 \
    libasound2 \
    libpango-1.0-0 \
    libpangocairo-1.0-0 \
    --no-install-recommends \
    && rm -rf /var/lib/apt/lists/*

# Grant execute permissions on /tmp so the IronPDF engine can extract there
RUN chmod 777 /tmp/

# Copy the compiled JAR and set the entry point
COPY target/your-function.jar /app/function.jar
CMD ["java", "-jar", "/app/function.jar"]

chmod 777 /tmp/ 行是必要的,因為 IronPDF 需要在初始化期間寫入並執行引擎二進制。 如果工作目錄沒有執行權限,引擎將無法啟動。

提示在部署到 Cloud Functions 之前使用 docker builddocker run 在本地測試 Docker 映像。 本地測試可以提前捕獲缺失的依賴項,避免慢速的雲構建週期。

如何為 Google Cloud 部署配置 pom.xml?

標準 ironpdf Maven 工件包含多個平臺的引擎二進制。 對於 Google Cloud Functions(在 x86-64 Linux 上運行),新增平台特定的引擎工件以保持部署映像精簡 並確保正確的二進制文件始終可用:

//:path=pom.xml
<dependencies>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf</artifactId>
        <version>2024.9.1</version>
    </dependency>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf-engine-linux-x64</artifactId>
        <version>2024.9.1</version>
    </dependency>
</dependencies>
//:path=pom.xml
<dependencies>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf</artifactId>
        <version>2024.9.1</version>
    </dependency>

    <dependency>
        <groupId>com.ironsoftware</groupId>
        <artifactId>ironpdf-engine-linux-x64</artifactId>
        <version>2024.9.1</version>
    </dependency>
</dependencies>
XML

始終將版本號更新為IronPDF for Java 的最新發布ironpdf-engine-linux-x64 工件必須與核心 ironpdf 工件的版本完全匹配。

重要保持兩個版本號同步。 核心工件和引擎工件版本之間的不匹配將導致運行時啟動失敗。

如何新增 Maven Shade 插件?

當作為 uber-JAR(大 JAR)部署到 Google Cloud Functions 時,maven-shade-plugin 確保所有間接依賴項的服務裝載文件正確地合併。 沒有它,某些 gRPC 服務註冊可能會被默默地刪除,導致引擎初始化失敗。

在您的 pom.xml<build><plugins> 部分新增以下插件配置:

//:path=pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>

            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
//:path=pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>3.2.4</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>shade</goal>
            </goals>

            <configuration>
                <transformers>
                    <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                </transformers>
            </configuration>
        </execution>
    </executions>
</plugin>
XML

ServicesResourceTransformer 是關鍵部分。 它將來自每個依賴項 JAR 的 META-INF/services/ 條目合併到一個文件中。gRPC 使用 Java 的 ServiceLoader 機制,因此合併的服務文件是傳輸選擇(HTTP/2 vs. 純文字)運行時需要的。

如何新增可選的 gRPC 依賴項?

在某些部署配置中 - 特別是在使用某些版本的 Google Cloud Functions 框架時當使用陰影 JAR 時 - 需要顯式的 gRPC 傳輸依賴項。 如果函式因 gRPC 傳輸或通道錯誤而無法啟動,請新增這些:

//:path=pom.xml
<dependencies>

    <dependency>
        <groupId>io.perfmark</groupId>
        <artifactId>perfmark-api</artifactId>
        <version>0.26.0</version>
    </dependency>

    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-okhttp</artifactId>
        <version>1.50.2</version>
    </dependency>

    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty-shaded</artifactId>
        <version>1.50.2</version>
    </dependency>
</dependencies>
//:path=pom.xml
<dependencies>

    <dependency>
        <groupId>io.perfmark</groupId>
        <artifactId>perfmark-api</artifactId>
        <version>0.26.0</version>
    </dependency>

    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-okhttp</artifactId>
        <version>1.50.2</version>
    </dependency>

    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty-shaded</artifactId>
        <version>1.50.2</version>
    </dependency>
</dependencies>
XML

在大多數情況下,包括 grpc-netty-shaded 足以用於生產。 grpc-okhttp 傳輸是一個較輕的替代方案,當以最小化映像大小為優先事項時很有用。 只有在遇到關於遺失的跟踪註解的類路徑警告時才新增 perfmark-api

請注意查看 gRPC 發行說明 以確認 IronPDF 依賴集的最新相容版本。

如何為 Google Cloud Functions 設定資源限制?

IronPDF 在其第一次調用時在 Cloud Function 容器中啟動一個 Chromium 子進程。 Chromium 的啟動和初始渲染對記憶體的要求很高,函式必須保持活動以便引擎初始化。Cloud Functions 的預設資源限制對於可靠運行來說太低。

在部署函式時在 Google Cloud Console 或通過 gcloud CLI 中配置以下限制:

IronPDF Java 在 Google Cloud Function 的推薦資源設置
設置 建議值 原因
超時 330 秒 在冷啟動時,Chromium 初始化可能需要 60–90 秒。函式不能在引擎準備好之前超時。
記憶體 2,048 MB 或更高 Chromium 需要大量 RAM 來渲染複雜的 HTML 頁面。記憶體不足導致渲染過程中被終止。
臨時儲存 1,024 MB 或更高 引擎二進制文件和臨時 PDF 文件被寫入 /tmp/。儲存過低會導致提取或寫入失敗。

這些值是起始點。 大批量或複雜的 PDF 生成可能需要更高的記憶體分配。 監控 Google Cloud Console 中的雲函式記憶體使用度量,並在觀察到記憶體不足錯誤時增加限制。

警告不要將超時時間減少到 180 秒以下。 IronPDF 在雲函式上的冷啟動初始化始終需要比標準 Java 函式更長的時間。

如何配置工作目錄和文件權限?

IronPDF 引擎在啟動時將其二進制文件提取到工作目錄。在 Google Cloud Functions 上,唯一的可寫和可執行路徑是 /tmp/。 在調用任何 IronPDF API 之前明確設置工作目錄,並確保 Dockerfile 授予該路徑必要的權限。

在函式入口點的頂部新增此配置調用,在進行任何 PDF 操作之前:

//:path=/static-assets/pdf/content-code-examples/tutorials/google-cloud/configure-working-directory.java
import com.ironsoftware.ironpdf.Settings;
import java.nio.file.Paths;

public class PdfFunction {
    static {
        // Must be called before any IronPDF operation.
        // /tmp/is the only writable and executable directory in Cloud Functions.
        Settings.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
    }
}
//:path=/static-assets/pdf/content-code-examples/tutorials/google-cloud/configure-working-directory.java
import com.ironsoftware.ironpdf.Settings;
import java.nio.file.Paths;

public class PdfFunction {
    static {
        // Must be called before any IronPDF operation.
        // /tmp/is the only writable and executable directory in Cloud Functions.
        Settings.setIronPdfEngineWorkingDirectory(Paths.get("/tmp/"));
    }
}
JAVA

然後將相應的權限命令新增到您的 Dockerfile:

//:path=Dockerfile
# Ensure the IronPDF engine can extract and run binaries from /tmp/
RUN chmod 777 /tmp/

using static {} 初始化器塊保證在函式中的任何類嘗試載入 IronPDF 引擎之前已配置工作目錄。如果在實例方法或請求處理器中設置它,可能會存在其他執行緒在路徑配置之前初始化引擎的風險。

接下來的步驟是什麼?

本指南涵蓋了使用自定義 Docker 容器在 Google Cloud Function 中運行 IronPDF for Java 的完整配置。 關鍵點是:使用安裝 Chrome 系統依賴的自定義 Dockerfile,包括 ironpdf-engine-linux-x64 Maven 工件,將工作目錄配置為 /tmp/,將超時設置至少 330 秒且記憶體至少設置 2,048 MB,並新增 maven-shade-plugin 以合併服務裝載文件。

要探索 IronPDF for Java 的更多功能,請存取 IronPDF for Java 文件 或嘗試這些指南之一:

獲取免費試用授權 在您的 Google Cloud 環境中測試 IronPDF for Java。 生產部署需要授權金鑰。 購買授權 當您準備好上線時。

常見問題

為什麼IronPDF for Java無法在預設的Google Cloud Function映像上啟動?

預設的Cloud Function執行環境映像不包括Chromium所需的Linux系統函式庫,例如libnss3libatk1.0-0以及相關的圖形包。IronPDF的渲染引擎在內部使用Chromium,因此需要一個可以明確安裝這些依賴的自訂Dockerfile。

為什麼IronPDF在Google Cloud上不支持Zip部署?

IronPDF必須在運行時提取並執行本機Chromium二進制檔案。Zip部署模型不提供可寫入和可執行的文件系統,因此引擎無法提取或啟動其二進制檔案。需要基於Docker的部署。

在Google Cloud Functions上,IronPDF需要什麼Maven依賴?

com.ironsoftware群組中將ironpdf-engine-linux-x64加入到pom.xml中。版本號必須與核心ironpdf工件完全匹配。此工件綑綁了IronPDF用於渲染的Linux x86-64 Chromium二進制檔案。

為什麼IronPDF for Java需要maven-shade-plugin?

打包為超級JAR時,maven-shade-pluginServicesResourceTransformer一起合併來自所有依賴項JAR的META-INF/services/文件。沒有它,gRPC服務註冊可能會被默默刪除,導致IronPDF引擎初始化失敗。

在運行IronPDF的Google Cloud Functions需要什麼逾時和記憶體設置?

將函式逾時設置為330秒,記憶體至少2048 MB,臨時儲存至少1024 MB。Chromium在冷啟動時初始化可能需要60至90秒,引擎需要大量記憶體來渲染複雜的HTML頁面。

為什麼Settings.setIronPdfEngineWorkingDirectory在Google Cloud上必須指向/tmp/?

/tmp/目錄是大多數Google Cloud Function執行環境中唯一的可寫入和可執行路徑。IronPDF需要將其引擎二進制文件提取並將臨時文件寫入此位置。沒有此設置,引擎找不到合適的提取目標,將無法啟動。

為什麼Dockerfile需要RUN chmod 777 /tmp/?

IronPDF的引擎二進制文件必須從/tmp/中編寫和執行。一些基本映像中/tmp/的預設權限不包括對所有使用者的執行權限。chmod 777命令確保函式運行時使用者可以提取並啟動二進制文件。

什麼時候應使用grpc-okhttp而不是grpc-netty-shaded?

grpc-netty-shaded建議用於生產,因為它提供了更完整的HTTP/2實現。當優化Docker映像大小為優先時,grpc-okhttp是一個較輕的替代方案。兩種傳輸均可在Google Cloud Functions上的IronPDF for Java中使用。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

準備好開始了嗎?
版本: 2026.6 剛剛發布
Still Scrolling Icon

還在滾動嗎?

想要快速證明嗎?
運行範例 觀看您的HTML變成PDF。