ナビゲーションをスキップ

フォークされた Tomcat Native

このページがGithub Wikiページから自動生成されていることをご存知ですか? こちらでご自身で改善できます!

netty-tcnativeTomcat Nativeのフォークです。これには、Twitter, Incによって貢献された一連の変更が含まれています。例えば、

  • ネイティブライブラリの配布とリンクの簡素化
  • プロジェクトの完全なMaven化
  • OpenSSLサポートの改善

メンテナンスの負担を最小限に抑えるために、安定したアップストリームリリースごとに専用のブランチを作成し、維持するブランチの数を最小限に抑えながら、その上に独自の変更を適用します。

アーティファクト

netty-tcnativeはマルチモジュールプロジェクトであり、さまざまな環境で使用できるようにいくつかのアーティファクトをビルドします。

ArtifactId 説明 Maven Central
netty-tcnative-{os_arch} これは、libapr-1OpenSSLの両方に動的にリンクされる「デフォルト」のアーティファクトです。このアーティファクトを使用するには、システムにlibapr-1とOpenSSLの両方がインストールされ、構成されている必要があります。このアーティファクトは、サイト管理者がアプリケーションを再構築せずにOpenSSLを自由にアップグレードできる本番環境で役立ちます。独自のAPRおよびOpenSSLビルドを作成してインストールしない限り、このバージョンはWindowsではサポートされていません。 はい
netty-tcnative-boringssl-static-{os_arch} このアーティファクトは、Googleのboringsslに対して静的にリンクされています。これは、コードフットプリントが小さく、この執筆時点ではLinuxの安定リリースには登場していない追加機能(ALPNなど)を備えたOpenSSLのフォークです。静的リンクにより、追加のインストール手順を気にすることなく、システムでtcnativeを簡単に使い始めることができます。このライブラリはAPRを必要としません。 はい
netty-tcnative-boringssl-static これは、サポートされているすべてのnetty-tcnative-boringssl-static-{os_arch}に対して静的にリンクされたライブラリを含むuber jarです。これはかなり大きなjarになる傾向がありますが、アプリケーションがプラットフォームに適したjarを取得することを心配する必要がないため、開始エクスペリエンスが大幅に簡素化されます。 はい
netty-tcnative-openssl-static-{os_arch} このアーティファクトは、libapr-1とOpenSSLの両方に対して静的にリンクされているため、追加のインストール手順を気にすることなく、システムでtcnativeを簡単に使い始めることができます。 いいえ
netty-tcnative-libressl-static-{os_arch} 近日公開。 いいえ

GradleとBazel

mavenパッケージングはバージョン2.0.49.Finalで少し変更されました。変更はMavenユーザーには問題ありませんでしたが、GradleおよびBazelユーザーにはいくつかの問題が発生します。

netty-tcnative-boringssl "uber" jarのダウンロード方法

これは、プラットフォーム固有の分類子を必要としないため、最も簡単な依存関係です

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-tcnative-boringssl-static</artifactId>
      <version>2.0.0.Final</version>
    </dependency>
    ...
  </dependencies>
  ...
</project>

netty-tcnative-boringssl-staticのダウンロード方法

アプリケーションのpom.xmlに、os-maven-plugin拡張機能と、プラットフォームに適したnetty-tcnative-boringssl-static依存関係を追加します。

<project>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-tcnative-boringssl-static</artifactId>
      <version>2.0.0.Final</version>
      <classifier>${os.detected.classifier}</classifier>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    ...
    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.4.0.Final</version>
      </extension>
    </extensions>
    ...
  </build>
  ...
</project>

Netty-tcnativeは、Maven Centralにデプロイするときに分類子を使用し、次のプラットフォームのディストリビューションを提供します。

分類子 説明
windows-x86_64 Windowsディストリビューション
osx-x86_64 Macディストリビューション
linux-x86_64 Linuxディストリビューション

netty-tcnativeのダウンロード方法

アプリケーションのpom.xmlに、os-maven-plugin拡張機能とnetty-tcnative依存関係を追加します。

<project>
  <properties>
    <!-- Configure the os-maven-plugin extension to expand the classifier on -->
    <!-- Fedora-"like" systems. -->
     <os.detection.classifierWithLikes>fedora</os.detection.classifierWithLikes>
  </properties>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-tcnative</artifactId>
      <version>2.0.0.Final</version>
      <classifier>${os.detected.classifier}</classifier>
    </dependency>
    ...
  </dependencies>
  ...
  <build>
    ...
    <extensions>
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.4.0.Final</version>
      </extension>
    </extensions>
    ...
  </build>
  ...
</project>

Netty-tcnativeは、さまざまなプラットフォームのディストリビューションを提供するために、Maven Centralにデプロイするときに分類子を使用します。 Linuxでは、OpenSSLが他のLinuxリリースとは異なるFedora派生物のソナメを使用することに注意する必要があります。バージョン1.1.33.Fork7以降、Linux用に2つの別々のバージョンをデプロイすることにより、この制限を回避しています(以下の表を参照)。

分類子 説明
windows-x86_64 Windowsディストリビューション(代わりにboringsslを使用することをお勧めします。複雑さについては以下を参照)
osx-x86_64 Macディストリビューション
linux-x86_64 Fedora以外のLinux派生物に使用
linux-x86_64-fedora Fedora派生物に使用

classifierWithLikesを使用すると、生成されたos.detected.classifierプロパティを変更するようにos-maven-pluginが構成されます。ビルドにos.detected.classifierに依存する他の依存関係が含まれている場合は、antrunプラグインを使用してnetty-tcnative分類子を手動で作成できます。

<project>
  <dependencies>
    <dependency>
      <groupId>io.netty</groupId>
      <artifactId>netty-tcnative</artifactId>
      <version>2.0.0.Final</version>
      <classifier>${tcnative.classifier}</classifier>
    </dependency>
  </dependencies>

  <build>
    <extensions>
      <!-- Use os-maven-plugin to initialize the "os.detected" properties -->
      <extension>
        <groupId>kr.motd.maven</groupId>
        <artifactId>os-maven-plugin</artifactId>
        <version>1.4.0.Final</version>
      </extension>
    </extensions>
    <plugins>
      <!-- Use Ant to configure the appropriate "tcnative.classifier" property -->
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <executions>
          <execution>
            <phase>initialize</phase>
            <configuration>
              <exportAntProperties>true</exportAntProperties>
              <target>
                <condition property="tcnative.classifier"
                           value="${os.detected.classifier}-fedora"
                           else="${os.detected.classifier}">
                  <isset property="os.detected.release.fedora"/>
                </condition>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

使用方法

OpenSSLベースのSSLEngine実装を使用するには、io.netty.handler.ssl.SslContextクラスを使用します

public static void main(String[] args) throws Exception {
  File certificate = new File("certificate");
  File privateKey = new File("privateKey");
  SslContext sslContext =
    SslContextBuilder.forServer(certificate, privateKey)
                     .sslProvider(SslProvider.OPENSSL)
                     .build();
  ...
}

public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {

  private final SslContext sslCtx;
  
  public MyChannelInitializer(SslContext sslCtx) {
    this.sslCtx = sslCtx;
  }
  
  @Override
  public void initChannel(SocketChannel ch) throws Exception {
    ChannelPipeline p = ch.pipeline();
    if (sslCtx != null) {
      p.addLast(sslCtx.newHandler(ch.alloc()));
    }
    ...
  }
}

Nettyは、netty-tcnative-XXXアーティファクトによって提供される共有ライブラリを一時ディレクトリに展開し、java.lang.System.load(String)を使用してロードします。

動的にリンクされたnetty-tcnativeの前提条件

netty-tcnativeアーティファクトの共有ライブラリは、Apache Portable Runtime(APR)およびOpenSSLに対して動的にリンクされていることに注意してください。これらは、システムライブラリディレクトリ、$LD_LIBRARY_PATH%PATH%などのライブラリロードパスにある必要があります。

  • Linuxを使用している場合は、システムのパッケージマネージャーを使用してインストールできるため、何もする必要はないでしょう。
  • Macを使用している場合は、Homebrewを使用してopensslパッケージをインストールする必要があります。
  • Windowsを使用している場合は、以下を行う必要があります。
    • APRを自分でビルドする。
    • Windows用OpenSSLをインストールする。
    • .DLLファイルを含むディレクトリを%PATH%に追加する。

重要:Linuxを使用しており、ALPN(http2に必要)を使用する場合は、openssl >= 1.0.2がインストールされていることを確認する必要があります。これがディストリビューションのパッケージシステムによって提供されていない場合は、自分でコンパイルし、ビルド方法で説明されているようにLD_LIBRARY_PATHを設定する必要があります。

静的にリンクされたnetty-tcnative-*-staticの前提条件

Fedora 30以降を使用している場合は、dnf -y install libxcrypt-compatを実行して必要な依存関係をインストールします。

そうしないと、「libcrypt.so.1:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません」のようなエラーが表示される可能性が高くなります。

ビルド方法

netty-tcnativeは、Linux x86_64Mac OS X x86_64、およびWindows x86_64用のネイティブライブラリを含むJARを公式に提供しているため、通常は自分でビルドする必要はありません。 SNAPSHOTビルドを探している場合は、Sonatype Snapshotsを参照してください。

Windows x86_32など、ネイティブライブラリを含むJARを提供していないプラットフォームを使用している場合は、このセクションの手順に従ってください。

依存関係の更新と検証

自分でビルドするときは、サードパーティの依存関係の整合性を検証することが重要です。また、ビルド内の依存関係の更新はチェックサムの失敗を引き起こし、パッケージメンテナはパッケージの整合性を確保するために、チェックサムを一致するように更新する前にこのプロセスに従う必要があります。

autoconf

apr

  • https://apr.apache.org/download.cgiでダウンロードします
  • aprのMD5サムを安全にフェッチします。apacheサイトはhttpにリンクしていますが、それをhttpsに変更します
  • 合計をファイルに貼り付けます
  • 合計を検証します。md5 -r apr-X.Y.Z.tar.gz | cut -d " " -f 1 | diff -u apr-X.Y.Z.tar.gz.md5 -

libressl

openssl

  • https://www.openssl.org/source/からtarballとSHA256署名をダウンロードします
  • 合計を検証します。sha1sum openssl-X.Y.Z.tar.gz | cut -d " " -f 1 | diff -u openssl-X.Y.Z.tar.gz.sha256 -

boringssl

boringsslは現在、tcnativeビルド用にバージョン管理されていません。代わりに、アップストリームのgoogle gitリポジトリからビルド時にchromium-stableブランチからプルするだけです

Linuxでのビルド

前提条件 説明
基本的なツール autoconf、automake、libtool、glibc-devel、make、tar、[xutils-devまたはimake]
APR apr-develまたはlibapr1-dev
OpenSSL openssl-develまたはlibssl-dev
GCC バージョン>= 4.8が必要です
CMake バージョン>= 2.8.8が必要です
Perl バージョン>= 5.6.1が必要です
Ninja バージョン>= 1.3.4が必要です
Go バージョン>= 1.5.1が必要です

パッケージをビルドし、ローカルのMavenリポジトリにインストールします

git clone https://github.com/netty/netty-tcnative.git
cd netty-tcnative
# To build a specific version: (e.g. netty-tcnative-2.0.0.Final)
git checkout netty-tcnative-[version]
# To build a snapshot: (e.g. 2.0.0.Final)
git checkout [branch]
./mvnw clean install

Linuxでのビルド(s390x)

IBM Z(s390x)でLinux用のnetty-tcnativeライブラリをビルドするには、こちらの手順に従い、ローカルのMavenリポジトリにインストールしてください。

Mac OS Xでのビルド

まず、Xcodeをインストールする必要があります。その後、コマンドラインツールもインストールしてください。

xcode-select --install

netty-tcnativeリポジトリをクローンし、Homebrewを使用して必要なパッケージをインストールします。

git clone https://github.com/netty/netty-tcnative.git
cd netty-tcnative
brew bundle

パッケージをビルドし、ローカルのMavenリポジトリにインストールします

# To build a specific version: (e.g. netty-tcnative-2.0.0.Final)
git checkout netty-tcnative-[version]
# To build a snapshot: (e.g. 2.0.0.Final)
git checkout [branch]
./mvnw clean install

Windowsでのビルド

このセクションでは、64ビット版Windowsでのビルド方法について説明します。32ビットシステムでビルドする場合は、これらの手順の一部を調整する必要があるかもしれません。

次のパッケージをインストールします。

  • Visual C++ 2013 Express
  • Windows 10 SDK
  • CMake
    • インストール中に、CMakeを現在のユーザーのシステムPATHに追加するを選択してください。
  • Perl
  • Ninja
    • 実行可能ファイルをC:\Workspaces\に展開し、C:\WorkspacesPATHに追加します。
  • Go
  • Yasm
    • C:\Workspacesにダウンロードします。
    • 環境変数ASM_NASM=C:\Workspaces\yasm-1.3.0-win64.exeを設定します。
  • OpenSSL.
    • インストール中に、OpenSSL DLLをコピー先: OpenSSLバイナリ (/bin) ディレクトリを選択します。
    • 次の環境変数を設定します。
      • OPENSSL_INCLUDE_DIR=C:\OpenSSL-Win64\include
      • OPENSSL_LIB_DIR=C:\OpenSSL-Win64\lib
  • Apache Portable Runtime (APR) 1.5.2
    • C:\Workspaces\apr-1.5.2に展開します。
    • コマンドプロンプト(cmd.exe)で、C:\Workspaces\apr-1.5.2から次のコマンドを実行します。
      • "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86_amd64
      • nmake /f Makefile.win ARCH="x64 Release" PREFIX=..\apr-1.5.2-dist buildall install
      • xcopy include\arch\win32\*.h ..\apr-1.5.2-dist\include /d
      • xcopy include\arch\*.h ..\apr-1.5.2-dist /d
    • 次の環境変数を設定します。
      • APR_INCLUDE_DIR=C:\Workspaces\apr-1.5.2-dist\include
      • APR_LIB_DIR=C:\Workspaces\apr-1.5.2-dist\lib

次に、コマンドプロンプト(cmd.exe)を起動し、Visual C++に必要な環境変数をロードします。

"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" x86_amd64

netty-tcnativeをクローンし、ビルドします。

git clone https://github.com/netty/netty-tcnative.git
cd netty-tcnative
REM To build a specific version: (e.g. netty-tcnative-2.0.0.Final)
git checkout netty-tcnative-[version]
REM To build a snapshot: (e.g. 2.0.0.Final)
git checkout [branch]
mvnw clean install

新しいフォークの作成

ブランチbootstrapをチェックアウトし、アップストリームのtcnativeバージョンを指定してnew-forkスクリプトを実行すると、アップストリームのtcnativeバージョンと同じ名前の新しい完全なMaven化されたブランチが作成されます。例えば、

$ git checkout bootstrap
$ ./new-fork 1.1.29 1

1.1.29という名前の新しいブランチが作成されます。このブランチには、tcnative-1.1.29のMaven化されたフォークが含まれます。このフォークには、tcnativeのメインソースコードを変更するようなパッチは含まれていないことに注意してください。おそらく、すでにパッチが適用されている他のブランチからいくつかのコミットをcherry-pickする必要があるでしょう。

最終取得日:2024年7月19日