跳到正文
LICENTIVO / INTEGRATION

Java 軟體授權整合:啟用、驗證與匯出功能保護

在 Java 17+ 應用程式中啟用客戶金鑰並保護實際匯出。保留一個用戶端,由 SDK 管理裝置憑證、心跳與允許的離線使用。

Java 17+更新日期

1. 準備產品與授權

先使用裝置綁定授權與一般匯出功能,確認授權流程正常後再增加功能次數計量。

裝置額度按目前啟用裝置計算,釋放後返還;一般授權離線仍占用,浮動授權租約到期後自動返還。

  1. 在控制台「產品」複製產品 ID,點擊同一產品的「簽章公鑰」,將每一組金鑰 ID、公鑰填入初始化程式碼,取代 YOUR_PRODUCT_ID、YOUR_KEY_ID 和 YOUR_PUBLIC_KEY。快速接入也可直接複製已填好的程式碼。無需設定檔;SDK 預設連線至 https://www.licentivo.com。
  2. 在「快速整合」建立或選擇產品,在策略中啟用名為 export 的功能,並準備測試授權。

2. 安裝 SDK

此版本正在完成發布驗證。

3. 保護一次實際匯出

將 SDK 初始化接到自己軟體的啟動或啟用入口,從啟用視窗讀取客戶授權碼,傳入產品 ID、信任公鑰並保持用戶端存活。將 RunFeature 放在實際業務入口,以自己的功能取代匯出範例函式。

Java · Quickstart.java
import licentivo.Client;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;

/** A single protected operation. Keep Client alive while your application runs. */
public final class Quickstart {
// BEGIN LICENTIVO PRODUCT
// Copy Product ID and all key ID/public key pairs from Console > Products > Signing public keys.
private static final String PRODUCT_ID = "YOUR_PRODUCT_ID";
private static final Map<String,String> TRUSTED_KEYS = Map.of("YOUR_KEY_ID", "YOUR_PUBLIC_KEY");
// END LICENTIVO PRODUCT

    private static String setting(String name, String fallback) {
        String value = System.getenv(name);
        return value == null || value.isEmpty() ? fallback : value;
    }

    static void exportReport(String path) throws Exception {
        // Replace this write with your existing, non-metered export operation.
        Files.writeString(Path.of(path), "A report generated by the licensed application.\n");
    }

    public static void main(String[] args) {
        // In a GUI, read the activation input. Later starts pass an empty key.
        try (var client = Client.openProduct(PRODUCT_ID, TRUSTED_KEYS,
                setting("LICENTIVO_LICENSE_KEY", ""), error -> System.err.println("Background verification: " + error.getMessage()))) {
            String feature = setting("LICENTIVO_FEATURE", "export");
            String path = setting("LICENTIVO_OUTPUT", "licensed-report.txt");
            if (setting("LICENTIVO_METERED", "").equals("1"))
                client.runMeteredFeature(feature, 1, setting("LICENTIVO_OPERATION_ID", ""), () -> exportReport(path));
            else
                client.runFeature(feature, () -> exportReport(path));
            System.out.println("License OK: " + feature + " is available\nExport completed: " + path);
        } catch (Exception error) {
            System.err.println(error.getMessage());
            System.exit(2);
        }
    }
}

4. 在應用程式結束時關閉用戶端

本命令列範例執行一次操作後結束。整合桌面應用程式時,在啟動時建立一個用戶端,在匯出按鈕或命令中呼叫功能回呼,直到應用程式結束才關閉用戶端。

首次啟用後,後續啟動可將 LICENTIVO_LICENSE_KEY 留空,在相同使用者及快取位置還原私有裝置憑證。憑證儲存在使用者應用程式資料目錄,不隨安裝套件散布。關閉用戶端會停止心跳並歸還浮動席位;一般結束不應取消裝置綁定。

只有策略允許、簽章授權仍有效時才能離線使用。授權過期或功能遭拒時持續阻止業務操作;功能次數計量需要連線。

Swing 或 JavaFX 應用程式應在背景執行緒處理啟動驗證,再將背景通知切回介面執行緒。讓 Client 的生命週期涵蓋視窗,結束時由 try-with-resources 關閉。

5. 執行並核對結果

在控制台「產品」複製產品 ID,點擊同一產品的「簽章公鑰」,將每一組金鑰 ID、公鑰填入初始化程式碼,取代 YOUR_PRODUCT_ID、YOUR_KEY_ID 和 YOUR_PUBLIC_KEY。快速接入也可直接複製已填好的程式碼。無需設定檔;SDK 預設連線至 https://www.licentivo.com。

  1. 使用允許 export 的有效授權執行,確認產生 licensed-report.txt。
  2. 清空 LICENTIVO_LICENSE_KEY,以相同使用者再次執行,確認可還原已儲存的裝置憑證。
  3. 將 LICENTIVO_FEATURE 改為授權未提供的功能,並將 LICENTIVO_OUTPUT 改為新檔名。程式應提示拒絕,而且不產生新檔案。
  4. 僅在策略允許且簽章授權未到期時測試離線重新啟動。背景更新發生錯誤後,也不能略過失敗的功能檢查。
Windows · PowerShell
javac -cp licentivo-sdk-0.11.6.jar -d out Quickstart.java
$env:LICENTIVO_LICENSE_KEY = 'YOUR_LICENSE_KEY'
java -cp "out;licentivo-sdk-0.11.6.jar" Quickstart
Linux / macOS · Bash
javac -cp licentivo-sdk-0.11.6.jar -d out Quickstart.java
LICENTIVO_LICENSE_KEY=YOUR_LICENSE_KEY java -cp "out:licentivo-sdk-0.11.6.jar" Quickstart

常見整合問題

檢查產品 ID、每組金鑰 ID 和公鑰、客戶輸入的授權碼。公鑰屬於產品;客戶授權與本機憑證分別管理。開發測試授權碼及廠商管理 API Key 不隨客戶安裝包發送。

功能遭拒、裝置數已滿或授權過期:在控制台核對授權與策略,並向客戶顯示 SDK 錯誤。授權失敗時不能呼叫匯出函式。

一般功能介面只檢查權限;計次介面負責預留與結算已設定的用量。每項實際業務使用獨立且穩定的操作編號;中斷還原前先核對持久化業務結果。

找不到類別:執行時的 classpath 須同時包含 out 與 SDK JAR。Windows 以分號分隔,Linux 與 macOS 以冒號分隔。