

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Elastic Beanstalk Java SE 平台
<a name="java-se-platform"></a>

本主題說明如何設定、建置和執行在 Java SE 平台上執行的 AWS Elastic Beanstalk Java 應用程式。

Elastic Beanstalk Java SE 平台是一組適用於 Java Web 應用程式的[平台版本](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.javase)，可以從編譯的 JAR 檔案自行執行。您可於本機編譯應用程式，或搭配建置指令碼上傳原始碼，藉此在執行個體上進行編譯。Java SE 平台版本會分組為平台分支，每個分支對應至 Java 的主要版本。

**注意**  
Elastic Beanstalk 不會剖析應用程式的 JAR 檔案。請將 Elastic Beanstalk 需要的檔案保存在 JAR 檔案外面。例如，將[工作者環境](using-features-managing-env-tiers.md)的 `cron.yaml` 檔案包含在應用程式原始碼套件的根目錄 (在 JAR 檔案旁邊)。

Elastic Beanstalk 主控台中提供了[修改正在執行環境組態](environment-configuration-methods-after.md)的組態選項。要避免在終止環境的組態時遺失組態，您可以使用[已儲存組態](environment-configuration-savedconfig.md)來儲存您的設定，並在之後套用至另一個環境。

若要將設定儲存於原始程式碼，您可以包含[組態檔案](ebextensions.md)。每次您建立環境或部署應用程式，組態檔案裡的設定就會套用。您也可以使用組態檔案來安裝套件、執行指令碼，並在部署期間執行其他執行個體自訂操作。

Elastic Beanstalk Java SE 平台內含可做為反向代理程式的 [nginx](https://www.nginx.com/) 伺服器，處理快取靜態內容並將請求傳送至您的應用程式。平台提供了組態選項來設定代理伺服器，從您原始程式碼中的資料夾提供靜態資產，以減輕應用程式的負擔。在進階的使用情境中，您可以在您的原始碼套件中，[加入自己的 .conf 檔案](java-se-nginx.md)，來擴展或完全覆寫掉 Elastic Beanstalk 的代理組態。

如果您只為應用程式來源提供單一 JAR 檔案 (自行提供，而非在原始碼套件中)，Elastic Beanstalk 會將 JAR 檔案重新命名為 `application.jar`，然後使用 `java -jar application.jar` 以執行之。欲設定在環境中伺服器執行個體上執行的程序，請於您的原始碼套件納入選用的 [Procfile](java-se-procfile.md)。若您的原始碼套件根目錄具有多個 JAR 檔案，或者您希望自訂 Java 命令來設定 JVM 選項，則必須使用 `Procfile`。

建議務必在原始碼套件和應用程式中，一併提供 `Procfile`。如此一來，就能精確掌控 Elastic Beanstalk 會針對應用程式執行哪些程序，以及這些程序會收到哪些引數。

欲在部署時編譯 Java 類別並於環境中 EC2 執行個體上執行其他建置命令，請將 [Buildfile](java-se-buildfile.md) 納入您的應用程式原始碼套件。`Buildfile` 可讓您依原狀部署原始碼，並可建置在伺服器上，而非於本機編譯 JAR。Java SE 平台包括常見的建置工具，可讓您在伺服器上進行建置作業。

如需各種擴充 Elastic Beanstalk Linux 類型平台方式的詳細資訊，請參閱 [擴充 Elastic Beanstalk Linux 平台](platforms-linux-extend.md)。

## 設定您的 Java SE 環境
<a name="java-se-options"></a>

Java SE 平台設定可讓您微調 Amazon EC2 執行個體的行為。您可以使用 Elastic Beanstalk 主控台編輯 Elastic Beanstalk 環境的 Amazon EC2 執行個體組態。

使用 Elastic Beanstalk 主控台來啟用至 Amazon S3 的日誌輪換，和設定您的應用程式可以從環境讀取的變數。

**在 Elastic Beanstalk 主控台中設定您的 Java SE 環境**

1. 開啟 [Elastic Beanstalk 主控台](https://console.aws.amazon.com/elasticbeanstalk)，然後在**區域**清單中選取您的 AWS 區域。

1. 在導覽窗格中，選擇**環境**，然後在清單中選擇您環境的名稱。

1. 在導覽窗格中，選擇**組態**。

1. 在**更新、監控和日誌記錄**組態類別中，選擇**編輯**。

### 日誌選項
<a name="java-se-options-logs"></a>

Log Options (日誌選項) 區段有兩個設定：
+ **執行個體設定檔** – 指定有權存取與您應用程式相關的 Amazon S3 儲存貯體的執行個體設定檔。
+ **Enable log file rotation to Amazon S3** (啟用 Amazon S3 的日誌檔案輪換) – 指定是否將應用程式 Amazon EC2 執行個體的日誌檔案複製到與應用程式關聯的 Amazon S3 儲存貯體。

### 靜態檔案
<a name="java-se-options-staticfiles"></a>

為改善效能，您可以使用 **Static files** (靜態檔案) 區段來設定代理伺服器，以為來自 Web 應用程式一組目錄中的靜態檔案 (例如 HTML 或影像) 提供服務。對於每個目錄，您可以設定目錄映射的虛擬路徑。代理伺服器收到位於指定路徑下的檔案請求時，會直接提供檔案而非將請求路由至您的應用程式。

如需使用組態檔案或 Elastic Beanstalk 主控台設定靜態檔案的詳細資訊，請參閱[提供靜態檔案](environment-cfg-staticfiles.md)。

### 環境屬性
<a name="java-se-options-properties"></a>

**Environment Properties (環境屬性)** 的部分可讓您針對執行您應用程式的 Amazon EC2 執行個體，來指定其上的環境資訊設定。環境屬性會以金鑰值對的形式傳到應用程式。

在 Elastic Beanstalk 內所執行的 Java SE 環境中，可使用 `System.getenv()` 來存取環境變數。例如，您可使用下列程式碼，來將名為 `API_ENDPOINT` 的屬性讀取到變數：

```
String endpoint = System.getenv("API_ENDPOINT");
```

如需詳細資訊，請參閱「[環境變數和其他軟體設定](environments-cfg-softwaresettings.md)」。

## Java SE 組態命名空間
<a name="java-se-namespaces"></a>

您可以使用[組態檔案](ebextensions.md)來設定組態選項，並在部署期間執行其他的執行個體設定工作。組態選項可以是[平台特定](command-options-specific.md)選項，也可以套用至 Elastic Beanstalk 服務整體中的所有[平台](command-options-general.md)。組態選項會組織成*命名空間*。

Java SE 平台不會定義任何平台特定的命名空間。您可以使用 `aws:elasticbeanstalk:environment:proxy:staticfiles` 命名空間設定代理提供靜態檔案。如需詳細資訊和範例，請參閱[提供靜態檔案](environment-cfg-staticfiles.md)。

Elastic Beanstalk 可提供許多組態選項讓您自訂環境。除了組態檔案，您也可以使用主控台、已儲存組態、EB CLI 或 AWS CLI來設定組態選項。如需詳細資訊，請參閱「[組態選項](command-options.md)」。

## Amazon Linux AMI (Amazon Linux 2 之前) Java SE 平台
<a name="java-se.alami"></a>

如果您的 Elastic Beanstalk Java SE 環境使用 Amazon Linux AMI 平台版本 (Amazon Linux 2 之前)，請閱讀本節中的其他資訊。

**備註**  
本主題中的資訊僅適用於以 Amazon Linux AMI (AL1) 為基礎的平台分支。AL2023/AL2 平台分支與舊版 Amazon Linux AMI (AL1) 平台版本不相容，*需要不同的組態設定*。
 在 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)Elastic Beanstalk 會根據 Amazon Linux AMI (AL1) 將所有平台分支的狀態設定為**已淘汰**。如需有關遷移至完全支援的目前 Amazon Linux 2023 平台分支的詳細資訊，請參閱 [將您的 Elastic Beanstalk Linux 應用程式遷移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### Amazon SE 組態命名空間 — Amazon Linux AMI (AL1)
<a name="java-se.alami.namespaces"></a>

您可以使用[組態檔案](ebextensions.md)來設定組態選項，並在部署期間執行其他的執行個體設定工作。組態選項可以是[平台特定](command-options-specific.md)選項，也可以套用至 Elastic Beanstalk 服務整體中的所有[平台](command-options-general.md)。組態選項會組織成*命名空間*。

除了[所有平台皆支援的命名空間](command-options-general.md)，Java SE 平台亦支援一個平台特定的組態命名空間。`aws:elasticbeanstalk:container:java:staticfiles` 命名空間可讓您定義選項，將您 Web 應用程式的路徑對應至應用程式原始碼套件中內含靜態內容的資料夾。

例如，此選項 [option\$1settings](ebextensions-optionsettings.md) 程式碼片段會定義靜態檔案命名空間內的兩個選項。第一個會將路徑 `/public` 對應至名為 `public` 的資料夾，第二個則將路徑 `/images` 對應至名為 `img` 的資料夾：

```
option_settings:
  aws:elasticbeanstalk:container:java:staticfiles:
    /html: statichtml
    /images: staticimages
```

您使用此命名空間對應的資料夾，必須為原始碼套件根目錄內的實際資料夾。您無法將路徑對應至 JAR 檔案中的資料夾。

Elastic Beanstalk 可提供許多組態選項讓您自訂環境。除了組態檔案，您也可以使用主控台、已儲存組態、EB CLI 或 AWS CLI來設定組態選項。如需詳細資訊，請參閱「[組態選項](command-options.md)」。

# 透過 Buildfile 在伺服器上建置 JAR
<a name="java-se-buildfile"></a>

您可於原始碼套件內的 `Buildfile` 檔案呼叫建置命令，藉此在您環境的 EC2 執行個體上，建置應用程式的類別檔案和 JAR。

`Buildfile` 中的命令僅能執行一次，且完成後必須終止，而 [Procfile](java-se-procfile.md) 的命令應於應用程式的使用壽命內持續執行，且被終止後會重新啟動。若要執行應用程式內的 JAR，請使用 `Procfile`。

如需 放置和語法的詳細資訊`Buildfile`，請參閱 [Buildfile 和 Procfile](platforms-linux-extend.build-proc.md)。

下列 `Buildfile` 範例執行 Apache Maven，藉此從原始碼建置 Web 應用程式。如需使用此功能的範例應用程式的詳細資訊，請參閱 [Java Web 應用程式範例](java-getstarted.md#java-getstarted-samples)。

**Example Buildfile**  

```
build: mvn assembly:assembly -DdescriptorId=jar-with-dependencies
```

Java SE 平台包含下列建置工具，您可從建置指令碼進行呼叫：
+ `javac` – Java 編譯器
+ `ant` – Apache Ant
+ `mvn` – Apache Maven
+ `gradle` – Gradle

# 使用 Procfile 設定應用程式程序
<a name="java-se-procfile"></a>

若您應用程式原始碼套件的根目錄內含多個 JAR 檔案，請務必納入 `Procfile` 檔案，以指示 Elastic Beanstalk 應執行的 JAR。您亦可為單一 JAR 應用程式納入 `Procfile` 檔案，藉此設定執行您應用程式的 Java 虛擬機器 (JVM)。

建議務必在原始碼套件和應用程式中，一併提供 `Procfile`。如此一來，就能精確掌控 Elastic Beanstalk 會針對應用程式執行哪些程序，以及這些程序會收到哪些引數。

如需撰寫和使用 的詳細資訊，`Procfile`請參閱 [Buildfile 和 Procfile](platforms-linux-extend.build-proc.md)。

**Example Procfile**  

```
web: java -Xms256m -jar server.jar 
cache: java -jar mycache.jar
web_foo: java -jar other.jar
```

執行應用程式中主要 JAR 的命令必須稱為 `web`，且必須為 `Procfile` 中列出的第一條命令。nginx 伺服器會將所有接收自您環境負載平衡器的 HTTP 請求，轉送至此應用程式。

Elastic Beanstalk 假設 Procfile 的所有項目應隨時執行，並自動重新啟動 Procfile 中定義的所有已終止的應用程式。欲執行將終止且不重新啟動的命令，請使用 [`Buildfile`](java-se-buildfile.md)。

## 在 Amazon Linux AMI (Amazon Linux 2 之前) 上使用 Procfile
<a name="java-se-procfile.alami"></a>

如果您的 Elastic Beanstalk Java SE 環境使用 Amazon Linux AMI 平台版本 (Amazon Linux 2 之前)，請閱讀本節中的其他資訊。

**備註**  
本主題中的資訊僅適用於以 Amazon Linux AMI (AL1) 為基礎的平台分支。AL2023/AL2 平台分支與舊版 Amazon Linux AMI (AL1) 平台版本不相容，*需要不同的組態設定*。
 在 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)Elastic Beanstalk 會根據 Amazon Linux AMI (AL1) 將所有平台分支的狀態設定為**已淘汰**。如需有關遷移至完全支援的目前 Amazon Linux 2023 平台分支的詳細資訊，請參閱 [將您的 Elastic Beanstalk Linux 應用程式遷移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### 連接埠傳遞 — Amazon Linux AMI (AL1)
<a name="java-se-procfile.alami.ports"></a>

Elastic Beanstalk 預設會設定 nginx 代理將請求轉送至連接埠 5000 上的應用程式。您可將 `PORT` [環境屬性](java-se-platform.md#java-se-options)設定為主要應用程式接聽的連接埠，藉此覆寫預設連接埠。

如果您使用 `Procfile` 來執行多個應用程式，Amazon Linux AMI 平台版本上的 Elastic Beanstalk 預期每個額外的應用程式都須接聽編號比前一個多 100 的連接埠。Elastic Beanstalk 將每個應用程式內部可存取的 PORT 變數，設定為其預期應用程式執行所用的連接埠。您可呼叫 `System.getenv("PORT")`，藉此於應用程式程式碼內存取此變數。

在上述 `Procfile` 範例中，`web` 應用程式會接聽連接埠 5000，`cache` 會接聽連接埠 5100，而 `web_foo` 會接聽連接埠 5200。`web` 會讀取 `PORT` 變數，藉此設定其接聽的連接埠，並於該連接埠編號加 100 以判定 `cache` 接聽的連接埠，從而向其傳送請求。

# 設定代理伺服器
<a name="java-se-nginx"></a>

Elastic Beanstalk 使用 [nginx](https://www.nginx.com/) 做為反向代理伺服器，在連接埠 80 上將您的應用程式映射到 Elastic Load Balancing 負載平衡器。Elastic Beanstalk 提供了預設的 nginx 組態，您可以加以擴展，或使用自己的組態將其完全覆寫。

Elastic Beanstalk 預設會設定 nginx 代理將請求轉送至連接埠 5000 上的應用程式。您可將 `PORT` [環境屬性](java-se-platform.md#java-se-options)設定為主要應用程式接聽的連接埠，藉此覆寫預設連接埠。

**注意**  
您應用程式接聽的連接埠，不會影響 nginx 伺服器為接收來自負載平衡器的請求所接聽的連接埠。

**在您的平台版本上設定代理伺服器**  
所有 AL2023/AL2 平台皆支援統一的代理組態功能。如需在執行 AL2023/AL2 的平台版本上設定代理伺服器的詳細資訊，請參閱 [反向代理組態](platforms-linux-extend.proxy.md)。

## 在 Amazon Linux AMI (之前的 Amazon Linux 2) 上設定代理
<a name="java-se-nginx.alami"></a>

如果您的 Elastic Beanstalk Java SE 環境使用 Amazon Linux AMI 平台版本 (Amazon Linux 2 之前)，請閱讀本節中的其他資訊。

**備註**  
本主題中的資訊僅適用於以 Amazon Linux AMI (AL1) 為基礎的平台分支。AL2023/AL2 平台分支與舊版 Amazon Linux AMI (AL1) 平台版本不相容，*需要不同的組態設定*。
 在 [2022 年 7 月 18 日，](https://docs.aws.amazon.com/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)Elastic Beanstalk 會根據 Amazon Linux AMI (AL1) 將所有平台分支的狀態設定為**已淘汰**。如需有關遷移至完全支援的目前 Amazon Linux 2023 平台分支的詳細資訊，請參閱 [將您的 Elastic Beanstalk Linux 應用程式遷移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

### 擴展和覆寫預設的代理組態 — Amazon Linux AMI (AL1)
<a name="java-se-nginx.alami.extending"></a>

若要擴展 Elastic Beanstalk 的預設 nginx 組態，請將 `.conf` 組態檔案加進您應用程式原始碼套件中名為 `.ebextensions/nginx/conf.d/` 的資料夾。Elastic Beanstalk nginx 組態會自動在此資料夾中加入 `.conf` 檔案。

```
~/workspace/my-app/
|-- .ebextensions
|   `-- nginx
|       `-- conf.d
|           `-- myconf.conf
`-- web.jar
```

若要完全覆寫 Elastic Beanstalk 預設 nginx 組態，請在 `.ebextensions/nginx/nginx.conf` 的原始碼套件中加入組態：

```
~/workspace/my-app/
|-- .ebextensions
|   `-- nginx
|       `-- nginx.conf
`-- web.jar
```

如果您覆寫了 Elastic Beanstalk nginx 組態，請在 `nginx.conf` 中加入下列行，以納入適用於 [Elastic Beanstalk 中的增強型運作狀態報告和監控](health-enhanced.md)、自動應用程式映射和靜態檔案的 Elastic Beanstalk 組態。

```
 include conf.d/elasticbeanstalk/*.conf;
```

以下來自 [Scorekeep 範例應用程式](https://github.com/aws-samples/eb-java-scorekeep/)的範例組態會覆寫 Elastic Beanstalk 的預設組態，以提供 `public` 的 `/var/app/current` 子目錄的靜態 Web 應用程式，其中 Java SE 平台複製應用程式原始程式碼。`/api` 位置轉發流量以在 `/api/` 下路由傳送到連接埠 5000 上的 Spring 應用程式接聽。根路徑的 Web 應用程式提供其他所有流量。

**Example**  

```
user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    33282;

events {
    worker_connections  1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  include       conf.d/*.conf;

  map $http_upgrade $connection_upgrade {
      default     "upgrade";
  }

  server {
      listen        80 default_server;
      root /var/app/current/public;

      location / {
      }git pull
      

      location /api {
          proxy_pass          http://127.0.0.1:5000;
          proxy_http_version  1.1;

          proxy_set_header    Connection          $connection_upgrade;
          proxy_set_header    Upgrade             $http_upgrade;
          proxy_set_header    Host                $host;
          proxy_set_header    X-Real-IP           $remote_addr;
          proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
      }

      access_log    /var/log/nginx/access.log main;

      client_header_timeout 60;
      client_body_timeout   60;
      keepalive_timeout     60;
      gzip                  off;
      gzip_comp_level       4;

      # Include the Elastic Beanstalk generated locations
      include conf.d/elasticbeanstalk/01_static.conf;
      include conf.d/elasticbeanstalk/healthd.conf;
  }
}
```