文章目录
- 一、环境准备
- 二、下载源码包
- 三、操作过程
-
- 1. 解压
- 2. 构建apr库
- 3. 构建openssl库
- 4. 构建Tomcat Native库(dll文件)
- 5. 编译
- 6. 抽取关键文件
- 7. 压缩打包
- 四、遇到的问题
- 总结
本文主要参考 tomcat 官方文档 https://cwiki.apache.org/confluence/display/TOMCAT/Building the Tomcat Native Connector binaries for Windows
一、环境准备
这篇文章是在 环境下编译 tomcat-native ,请先安装如下:
- Windows Server 2003 R2 Platform SDK
- Windows 7 SDK
- Windows DDK 7.1.0
- cmsc
- JDK8
- perl
- C的编译工具(MinGW)
- Visual Studio 2008
注意:Visual Studio 2008 安装时记得钩上C 里面的x64位编译器,默认不勾
我也是按照 tomcat 官方版本成功编译,其他版本的环境不确定
二、下载源码包
- openssl源码压缩包(openssl-OpenSSL_1_1_1k.zip) https://github.com/openssl/openssl/tree/OpenSSL_1_1_1k
- apr源码压缩包(apr-1.7.0-win32-src.zip) https://github.com/apache/apr/tree/1.7.0
- tomcat-native源码(tomcat-native-1.2.31-win32-src.zip) https://dlcdn.apache.org/tomcat/tomcat-connectors/native/1.2.31/source/
在 windows 环境下编译 tomcat-native,其实是将 apr、openssl 编译使用的源代码包,最终形成可调用的库文件 tcnative-1.dll
注:您必须高度重视这些源码包的版本号,并在编译后指定这些版本号
三、操作过程
1. 解压
解压上下载的三个源码
- 将 apr-1.7.0-win32-src.zip 解压目录下的一切都切 tomcat-native 的 native/srclib/apr 下
- 将 openssl-OpenSSL_1_1_1k.zip 解压目录下的一切都切 tomcat-native 的 native/srclib/openssl 下
注意:复制 apr、openssl 不要带上最外层的目录,直接复制里面。如果目录不正确,以后的操作就会出错。
2. 构建apr库
分别打开 和 编译器命令窗口
注意:下面的命令,带 x64 的就用 Visual Studio 2008 x64 执行命令窗口,否者报错
cd 进去 native/srclib/apr
nmake -f NMAKEmakefile BUILD_CPU=x86 APR_DECLARE_STATIC=1 nmake -f NMAKEmakefile BUILD_CPU=x64 APR_DECLARE_STATIC=1
3. 构建openssl库
cd 进去 native/srclib/openssl
构建32位库文件
perl Configure no-shared VC-WIN32 nmake mkdir out32-x86 copy libssl.lib out32-x86\ copy libcrypto.lib out32-x86\ copy apps\openssl.exe out32-x86\ nmake clean
构建64位库文件
perl Configure no-shared VC-WIN64A nmake mkdir out32-x64 copy libssl.lib out32-x64\ copy libcrypto.lib out32-x64\ copy apps\openssl.exe out32-x64\
4. 构建Tomcat Native库(dll文件)
cd 进去 native/srclib 注:下面的版本对应你下载包的版本
set OPENSSL_VER=1.1.1k set APR_VER=1.7.0 mkdir \deps-x86\apr-%APR_VER%\include mkdir \deps-x86\apr-%APR_VER%\lib mkdir \deps-x86\openssl-%OPENSSL_VER%\include mkdir \deps-x86\openssl-%OPENSSL_VER%\lib xcopy /E \deps-x86\apr-%APR_VER% \deps-x64\apr-%APR_VER%\ xcopy /E \deps-x86\openssl-%OPENSSL_VER% \deps-x64\openssl-%OPENSSL_VER%\ xcopy /E apr\include \deps-x86\apr-%APR_VER%\include\ xcopy /E apr\include \deps-x64\apr-%APR_VER%\include\ copy apr\WIN7_X86_LIB_RELEASE\apr-1.lib \deps-x86\apr-%APR_VER%\lib copy apr\WIN7_X64_LIB_RELEASE\apr-1.lib \deps-x64\apr-%APR_VER%\lib xcopy /E openssl\include\openssl \deps-x86\openssl-%OPENSSL_VER%\include\openssl\ xcopy /E openssl\include\openssl \deps-x64\openssl-%OPENSSL_VER%\include\openssl\ copy openssl\out32-x86\*.lib \deps-x86\openssl-%OPENSSL_VER%\lib\ copy openssl\out32-x64\*.lib \deps-x64\openssl-%OPENSSL_VER%\lib\ copy openssl\out32-x86\openssl.exe \deps-x86\openssl-%OPENSSL_VER%\ copy openssl\out32-x64\openssl.exe \deps-x64\openssl-%OPENSSL_VER%\
这时候你发现在该磁盘根目录下生成了 deps-x64、deps-x86 文件夹,里面有文件的
5. 编译
cd … 也就是到 tomcat-native的native目录
注意:下面修成你自己 jdk 的目录
set JAVA_HOME=C:\liqiye\software\jdk8
nmake -f NMAKEMakefile WITH_APR=C:\deps-x86\apr-%APR_VER% WITH_OPENSSL=C:\deps-x86\openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 ENABLE_OCSP=1 BUILD_CPU=x86
move WIN7_X86_DLL_RELEASE WIN7_X86_OCSP_DLL_RELEASE
nmake -f NMAKEMakefile WITH_APR=C:\deps-x86\apr-%APR_VER% WITH_OPENSSL=C:\deps-x86\openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 BUILD_CPU=x86
nmake -f NMAKEMakefile WITH_APR=C:\deps-x64\apr-%APR_VER% WITH_OPENSSL=C:\deps-x64\openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 ENABLE_OCSP=1 BUILD_CPU=x64
move WIN7_X64_DLL_RELEASE WIN7_X64_OCSP_DLL_RELEASE
nmake -f NMAKEMakefile WITH_APR=C:\deps-x64\apr-%APR_VER% WITH_OPENSSL=C:\deps-x64\openssl-%OPENSSL_VER% APR_DECLARE_STATIC=1 OPENSSL_NEW_LIBS=1 BUILD_CPU=x64
其实这时候我们要的目标文件 tcnative-1.dll 已经生成了
6. 抽取关键文件
还是在 tomcat-native的 native 目录下
set VER=1.2.31
mkdir tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin
copy LICENSE.bin.win tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\LICENSE
copy NOTICE.bin.win tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\NOTICE
copy ..\README.txt tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\
copy srclib\VERSIONS tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\
mkdir tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin
mkdir tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin\x64
copy C:\deps-x86\openssl-%OPENSSL_VER%\openssl.exe tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin
xcopy /E tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\
copy WIN7_X86_DLL_RELEASE\tcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin
copy WIN7_X86_OCSP_DLL_RELEASE\tcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\bin
copy WIN7_X86_DLL_RELEASE\tcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin
copy WIN7_X86_OCSP_DLL_RELEASE\tcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\bin
copy WIN7_X64_DLL_RELEASE\tcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin\x64
copy WIN7_X64_OCSP_DLL_RELEASE\tcnative-1.dll tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\bin\x64
copy WIN7_X64_DLL_RELEASE\tcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin\bin\x64
copy WIN7_X64_OCSP_DLL_RELEASE\tcnative-1-src.pdb tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin\bin\x64
然后在 tomcat-native 的 native 目录下出现以下两个目录 tomcat-native-1.2.31-openssl-1.1.1k-win32-bin tomcat-native-1.2.31-openssl-1.1.1k-ocsp-win32-bin
7. 压缩打包
还是在 tomcat-native的 native 目录下
set PATH=%PATH%;%JAVA_HOME%\bin
cd tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin
jar -cMf ..\tomcat-native-%VER%-openssl-%OPENSSL_VER%-win32-bin.zip *
cd ..\tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin
jar -cMf ..\tomcat-native-%VER%-openssl-%OPENSSL_VER%-ocsp-win32-bin.zip *
然后在 tomcat-native 的 native 目录下有了两个压缩包,他们跟官网下载的编译后的包是一样的
到这里已经完成在 windows 下将 tomcat-native 源码编译成 dll 文件了
四、遇到的问题
如果上面编译过程中,报错 fatal error C1083: 无 法打开包括文件:“jni.h”: No such file or directory
复制%JAVA_HOME%\include\下的 jni.h 到Visual Studio目录\VC\include 复制%JAVA_HOME%\include\win32\下的jni_md.h 到Visual Studio目录\VC\include\
换句话说,就是你安装的 Visual Studio ,他的 VC/include/ 目录下没有这两个文件,你去 jdk 下复制这两个文件过去就可以了
总结
欢迎指出我的错误!