フォークされた Tomcat Native
netty-tcnativeはTomcat Nativeのフォークです。これには、Twitter, Incによって貢献された一連の変更が含まれています。例えば、
- ネイティブライブラリの配布とリンクの簡素化
- プロジェクトの完全なMaven化
- OpenSSLサポートの改善
メンテナンスの負担を最小限に抑えるために、安定したアップストリームリリースごとに専用のブランチを作成し、維持するブランチの数を最小限に抑えながら、その上に独自の変更を適用します。
netty-tcnative
はマルチモジュールプロジェクトであり、さまざまな環境で使用できるようにいくつかのアーティファクトをビルドします。
ArtifactId | 説明 | Maven Central |
---|---|---|
netty-tcnative-{os_arch} | これは、libapr-1とOpenSSLの両方に動的にリンクされる「デフォルト」のアーティファクトです。このアーティファクトを使用するには、システムに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} | 近日公開。 | いいえ |
mavenパッケージングはバージョン2.0.49.Final
で少し変更されました。変更はMavenユーザーには問題ありませんでしたが、GradleおよびBazelユーザーにはいくつかの問題が発生します。
- Gradleの場合、解決策は、分類子を使用して
tcnative
依存関係を明示的に宣言することです。 - Bazelの場合、解決策はこの修正を含むBazelバージョンを使用することです:https://github.com/bazelbuild/rules_jvm_external/pull/687
これは、プラットフォーム固有の分類子を必要としないため、最も簡単な依存関係です
<project>
...
<dependencies>
...
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-boringssl-static</artifactId>
<version>2.0.0.Final</version>
</dependency>
...
</dependencies>
...
</project>
アプリケーションの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ディストリビューション |
アプリケーションの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
アーティファクトの共有ライブラリは、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を設定する必要があります。
Fedora 30以降を使用している場合は、dnf -y install libxcrypt-compat
を実行して必要な依存関係をインストールします。
そうしないと、「libcrypt.so.1:共有オブジェクトファイルを開けません:そのようなファイルまたはディレクトリはありません」のようなエラーが表示される可能性が高くなります。
netty-tcnative
は、Linux x86_64
、Mac OS X x86_64
、およびWindows x86_64
用のネイティブライブラリを含むJARを公式に提供しているため、通常は自分でビルドする必要はありません。 SNAPSHOTビルドを探している場合は、Sonatype Snapshotsを参照してください。
Windows x86_32など、ネイティブライブラリを含むJARを提供していないプラットフォームを使用している場合は、このセクションの手順に従ってください。
自分でビルドするときは、サードパーティの依存関係の整合性を検証することが重要です。また、ビルド内の依存関係の更新はチェックサムの失敗を引き起こし、パッケージメンテナはパッケージの整合性を確保するために、チェックサムを一致するように更新する前にこのプロセスに従う必要があります。
- http://ftp.gnu.org/gnu/autoconf/autoconf-X.Y.Z.tar.gzからtgzとtgz.sigをダウンロードします
gpg --keyserver keys.gnupg.net --recv-keys 2527436A
gpg --verify autoconf-X.Y.Z.tar.gz.sig
- 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 -
- 署名公開鍵:RWQg/nutTVqCUVUw8OhyHt9n51IC8mdQRd1b93dOyVrwtIXmMI+dtGFe
- (公開鍵はhttps://www.openbsd.org/libressl/signing.htmlでダウンロードできます)
- http://ftp.openbsd.org/pub/OpenBSD/LibreSSL/でtarball、署名、およびSHA256.sigをダウンロードします
- https://www.openbsd.org/libressl/signing.htmlのlibressl.pubを使用して検証します。
signify -C -x SHA256.sig -p /path/to/libressl.pub libressl-X.Y.Z.tar.gz
- 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は現在、tcnativeビルド用にバージョン管理されていません。代わりに、アップストリームのgoogle gitリポジトリからビルド時にchromium-stable
ブランチからプルするだけです
前提条件 | 説明 |
---|---|
基本的なツール | 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
IBM Z(s390x)でLinux用のnetty-tcnative
ライブラリをビルドするには、こちらの手順に従い、ローカルのMavenリポジトリにインストールしてください。
まず、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
このセクションでは、64ビット版Windowsでのビルド方法について説明します。32ビットシステムでビルドする場合は、これらの手順の一部を調整する必要があるかもしれません。
次のパッケージをインストールします。
- Visual C++ 2013 Express
- Windows 10 SDK
-
CMake
- インストール中に、
CMakeを現在のユーザーのシステムPATHに追加する
を選択してください。
- インストール中に、
- Perl
-
Ninja
- 実行可能ファイルを
C:\Workspaces\
に展開し、C:\Workspaces
をPATH
に追加します。
- 実行可能ファイルを
- 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する必要があるでしょう。