Персональный технический блог: www.zhenganwen.top
среда автора
- 64-битный / Windows10 / i5-7200U / 4-ядерный процессор, на виртуальной машине
Centos7(Может даже вне сети) скомпилированOpenJDK7u75
Рекомендуется использовать
UbuntuилиCentos, использовать там, где установлены зависимостиapt-get/yumможно заменить(RhelизyumИспользование исходников подлежит коммерческим ограничениям, поэтому полагаться на загрузку неудобно, рекомендуется использоватьcentosилиdebainили заменитьyumзаcentosОК, автор изначальноrhelСкомпилировал, перешагнул много ям и, наконец, поменял наcentosСкомпилировано успешно. ни за что,linuxЭто настоящее блюдо, но я также многому научился благодаря этому карьеру.linuxПроцедура компиляции исходного кода будет упомянута в этой статье).
Подготовка окружающей среды
Источник OpenJDK
openjdk7u75, главный герой, скачал и использовал для компиляции.
Bootstrap JDK
При компиляции JDK используется не весь C/C++, но используется и JAVA, поэтому требуется скомпилированный JDK, который официально называетсяBOOTSTRAP JDK, требование должно бытьJDK6 Update14версия выше. рекомендуетсяOracleСкачать с официального сайта, автор скачалjdk-7u4-linux-x64
Среда компилятора
Компиляция требует зависимостиGCC,C++Дождитесь среды, загрузка в один клик:
yum -y install build-essential gawk m4 openjdk6-jdk libasound2-print-dev binutils libmotif3 libmotif-dev ant
XcodeСвязанные библиотеки:
yum install libX*
Проверьте среду сборки
будет загруженopenjdkИсходный код и действиеbootstrap jdkизjdk7u4загрузить наcentosиз/usr/local/javaСкачать и разархивировать:
[root@pinyoyougou-docker java]# ls
jdk1.7.0_04 jdk-7u4-linux-x64.tar.gz openjdk openjdk-7u75-src-b13-18_dec_2014.zip
выше
openjdkэтоopenjdkКаталог после распаковки исходного пакета, запишите имя, и последующие операции будут основываться на этом каталоге.
Входитьopenjdkи проверить среду компиляции:
[root@pinyoyougou-docker java]# cd openjdk
[root@pinyoyougou-docker java]# make sanity
WARNING: LANG has been set to zh_CN.UTF-8, this can cause build failures.
Try setting LANG to 'C'.
WARNING: The version of zip being used is older than
the required version of '2.2'.
The version of zip found was ''.
ERROR: The Compiler version is undefined.
ERROR: Your CLASSPATH environment variable is set. This will
most likely cause the build to fail. Please unset it
and start your build again.
ERROR: Your JAVA_HOME environment variable is set. This will
most likely cause the build to fail. Please unset it
and start your build again.
ERROR: You seem to not have installed ALSA 0.9.1 or higher.
Please install ALSA (drivers and lib). You can download the
source distribution from http://www.alsa-project.org or go to
http://www.freshrpms.net/docs/alsa/ for precompiled RPM packages.
ERROR: FreeType version 2.3.0 or higher is required.
make[2]: 进入目录“/usr/local/java/openjdk/jdk/make/tools/freetypecheck”
/bin/mkdir -p /usr/local/java/openjdk/build/linux-amd64/btbins
rm -f /usr/local/java/openjdk/build/linux-amd64/btbins/freetype_versioncheck
make[2]: 离开目录“/usr/local/java/openjdk/jdk/make/tools/freetypecheck”
Failed to build freetypecheck.
ERROR: You do not have access to valid Cups header files.
Please check your access to
/usr/include/cups/cups.h
and/or check your value of ALT_CUPS_HEADERS_PATH,
CUPS is frequently pre-installed on many systems,
or may be downloaded from http://www.cups.org
В приведенном выше примере показаны два предупреждения и пять исключений, которые нам нужно устранить одно за другим. (если выmake sanityвыводcheck passэтот шаг можно пропустить)
-
Установить переменные среды
LANG=CWARNING: LANG has been set to zh_CN.UTF-8, this can cause build failures. Try setting LANG to 'C'.Решение:
[root@pinyoyougou-docker java]# export LANG=C -
zipВерсия ниже и должна быть обновленаWARNING: The version of zip being used is older than the required version of '2.2'. The version of zip found was ''.Решение:
yum install zip -
Отсутствующие зависимости сборки
ERROR: The Compiler version is undefined.решать:
[root@pinyoyougou-docker openjdk]# yum install gcc gcc-c++ -
отменить существующие
JDKпеременная средыERROR: Your CLASSPATH environment variable is set. This will most likely cause the build to fail. Please unset it and start your build again.Так как я был в этом
centosдоверитьсяjdkИ в/etc/profileнастроен вJAVA_HOME,CLASS_PATH, поэтому подсказка здесь предлагает временно отменить эти две настройки, иначе может возникнуть неизвестная ошибка. решать:[root@pinyoyougou-docker openjdk]# unset JAVA_HOME [root@pinyoyougou-docker openjdk]# unset CLASS_PATH -
отсутствие зависимостей звуковой карты
alsa,этоlinuxзависимость от широко используемого звукового оборудования,java.awtНам нужно полагаться на это.ERROR: You seem to not have installed ALSA 0.9.1 or higher. Please install ALSA (drivers and lib). You can download the source distribution from http://www.alsa-project.org or go to http://www.freshrpms.net/docs/alsa/ for precompiled RPM packages.решать
[root@pinyoyougou-docker openjdk]# yum search alsa 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.shu.edu.cn * updates: mirrors.aliyun.com ======================================== N/S matched: alsa ======================================== alsa-firmware.noarch : Firmware for several ALSA-supported sound cards alsa-lib.x86_64 : The Advanced Linux Sound Architecture (ALSA) library alsa-lib.i686 : The Advanced Linux Sound Architecture (ALSA) library alsa-lib-devel.i686 : Development files from the ALSA library alsa-lib-devel.x86_64 : Development files from the ALSA library alsa-plugins-arcamav.i686 : Arcam AV amplifier plugin for ALSA alsa-plugins-arcamav.x86_64 : Arcam AV amplifier plugin for ALSA alsa-plugins-maemo.i686 : Maemo plugin for ALSA alsa-plugins-maemo.x86_64 : Maemo plugin for ALSA alsa-plugins-oss.i686 : Oss PCM output plugin for ALSA alsa-plugins-oss.x86_64 : Oss PCM output plugin for ALSA alsa-plugins-pulseaudio.i686 : Alsa to PulseAudio backend alsa-plugins-pulseaudio.x86_64 : Alsa to PulseAudio backend alsa-plugins-samplerate.i686 : External rate converter plugin for ALSA alsa-plugins-samplerate.x86_64 : External rate converter plugin for ALSA alsa-plugins-upmix.i686 : Upmixer channel expander plugin for ALSA alsa-plugins-upmix.x86_64 : Upmixer channel expander plugin for ALSA alsa-plugins-usbstream.i686 : USB stream plugin for ALSA alsa-plugins-usbstream.x86_64 : USB stream plugin for ALSA alsa-plugins-vdownmix.i686 : Downmixer to stereo plugin for ALSA alsa-plugins-vdownmix.x86_64 : Downmixer to stereo plugin for ALSA alsa-tools.x86_64 : Specialist tools for ALSA alsa-tools-firmware.x86_64 : ALSA tools for uploading firmware to some soundcards alsa-utils.x86_64 : Advanced Linux Sound Architecture (ALSA) utilities alsa-plugins-speex.i686 : Rate Converter Plugin Using Speex Resampler alsa-plugins-speex.x86_64 : Rate Converter Plugin Using Speex Resampler [root@pinyoyougou-docker openjdk]# yum -y install alsa-lib* alsa-util*Процедура 1: Когда в подсказке отсутствуют зависимости, и вы не знаете, что делать
yum installКогда можно искать по предложенным ключевым словамyum search, а затем в списке результатов поиска используйте подстановочные знаки суффикса для загрузки зависимостей с тем же префиксом одним щелчком мыши. -
Недостаток
freetypeполагатьсяERROR: FreeType version 2.3.0 or higher is required.решать:
root@pinyoyougou-docker openjdk]# yum search freetype 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.shu.edu.cn * updates: mirrors.aliyun.com ====================================== N/S matched: freetype ====================================== freetype-demos.x86_64 : A collection of FreeType demos freetype-devel.i686 : FreeType development libraries and header files freetype-devel.x86_64 : FreeType development libraries and header files freetype.x86_64 : A free and portable font rendering engine freetype.i686 : A free and portable font rendering engine 名称和简介匹配 only,使用“search all”试试。 [root@pinyoyougou-docker openjdk]# yum install freetype-devel.x86_64Правило второе: используйте
yum installобычно приносят один-y, чтобы не всегда спрашивать, уверены ли вы в установке. -
Так что я тогда
make sanity, нашел еще одну проблемуERROR: You do not have access to valid Cups header files. Please check your access to /usr/include/cups/cups.h and/or check your value of ALT_CUPS_HEADERS_PATH, CUPS is frequently pre-installed on many systems, or may be downloaded from http://www.cups.orgНедостаток
cupsРаспечатайте рамку, решите:[root@pinyoyougou-docker openjdk]# yum search cups 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyun.com * extras: mirrors.shu.edu.cn * updates: mirrors.aliyun.com ======================================== N/S matched: cups ======================================== bluez-cups.x86_64 : CUPS printer backend for Bluetooth printers cups.x86_64 : CUPS printing system cups-client.x86_64 : CUPS printing system - client programs cups-devel.i686 : CUPS printing system - development environment cups-devel.x86_64 : CUPS printing system - development environment cups-filesystem.noarch : CUPS printing system - directory layout cups-filters.x86_64 : OpenPrinting CUPS filters and backends cups-filters-devel.i686 : OpenPrinting CUPS filters and backends - development environment cups-filters-devel.x86_64 : OpenPrinting CUPS filters and backends - development environment cups-filters-libs.i686 : OpenPrinting CUPS filters and backends - cupsfilters and fontembed : libraries cups-filters-libs.x86_64 : OpenPrinting CUPS filters and backends - cupsfilters and fontembed : libraries cups-ipptool.x86_64 : CUPS printing system - tool for performing IPP requests cups-libs.x86_64 : CUPS printing system - libraries cups-libs.i686 : CUPS printing system - libraries cups-lpd.x86_64 : CUPS printing system - lpd emulation ghostscript-cups.x86_64 : CUPS filter for interpreting PostScript and PDF gutenprint-cups.x86_64 : CUPS drivers for Canon, Epson, HP and compatible printers python-cups.x86_64 : Python bindings for CUPS python-cups-doc.x86_64 : Documentation for python-cups cups-pk-helper.x86_64 : A helper that makes system-config-printer use PolicyKit foomatic-filters.x86_64 : CUPS print filters for the foomatic package samba-krb5-printing.x86_64 : Samba CUPS backend for printing with Kerberos 名称和简介匹配 only,使用“search all”试试。 [root@pinyoyougou-docker openjdk]# yum install cups-devel.x86_64 -
make sanityосмотр пройден:Sanity check passed.
Написать сценарий запуска компилятора
После предыдущих неудач среда компиляции в основном готова, и тогда можноmakeСкомпилировано, но вам нужно установить некоторые переменные среды перед компиляцией, напримерboostrap jdkГде находится корневая директория, какие нужно компилировать, количество параллельных потоков компиляции и т.д.
существуетopenjdk/Создать подcompile.shИ введите следующее (подробнее см. в разделе Understanding the Java Virtual Machine):
#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错
export LANG=C
#Bootstrap JDK的安装路径。必须设置。
export ALT_BOOTDIR=/usr/local/java/jdk1.7.0_04
#允许自动下载依赖
export ALLOW_DOWNLOADS=true
#并行编译的线程数,设置为和CPU内核数量一致即可
export HOTSPOT_BUILD_JOBS=4
export ALT_PARALLEL_COMPILE_JOBS=4
#比较本次build出来的映像与先前版本的差异。这个对我们来说没有意义,必须设置为false,否则sanity检查会报缺少先前版本JDK的映像。如果有设置dev或者DEV_ONLY=true的话这个不显式设置也行。
export SKIP_COMPARE_IMAGES=true
#使用预编译头文件,不加这个编译会更慢一些
export USE_PRECOMPILED_HEADER=true
#要编译的内容
export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#export BUILD_CORBA=false
export BUILD_HOTSPOT=true
export BUILD_JDK=true
#要编译的版本
#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true
#export DEBUG_NAME=debug
#把它设置为false可以避开javaws和浏览器Java插件之类的部分的build。
BUILD_DEPLOY=false
#把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖,但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了。
BUILD_INSTALL=false
#这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些“”诡异的事情”,Makefile脚本检查到有这2个变量就会提示警告“)
unset JAVA_HOME
unset CLASSPATH
make 2>&1 | tee $ALT_OUTPUTDIR/build.log
Что нужно обратить внимание на:
- должен быть установлен
LANG=C,будетALT_BOOTDIRустановлен вboostrap jdkкорневой каталог - Если ваша система была настроена ранее
jdkПеременные среды должны быть здесьunset(Вышеупомянутый сначала40,41Ряд) - Указанное выше количество параллельных потоков является вашим
cpuКоличество ядер одинаковое
Другие места можно скопировать.
начать компиляцию
Запустите компиляцию, используя сценарий запуска компиляции, написанный выше:
[root@pinyoyougou-docker openjdk]# chmod +x compile.sh
[root@pinyoyougou-docker openjdk]# ./compile.sh
Этот процесс обычно занимает десятки минут, и если все пойдет хорошо, в конце будет отображаться время начала и окончания компиляции. (Конечно, в большинстве случаев путь к разочарованию весьма извилист~).
########################################################################
##### Leaving jdk for target(s) sanity all docs images #####
########################################################################
##### Build time 00:10:12 jdk for target(s) sanity all docs images #####
########################################################################
#-- Build times ----------
Target all_product_build
Start 2019-01-23 16:37:02
End 2019-01-23 16:48:00
00:00:23 corba
00:00:09 hotspot
00:00:03 jaxp
00:00:06 jaxws
00:10:12 jdk
00:00:03 langtools
00:10:58 TOTAL
-------------------------
make[1]: Leaving directory `/usr/local/java/openjdk'
[root@pinyoyougou-docker openjdk]#
Итак, вот список моих разочарований... еслиmakeпроисходит в процессеerrorАномальное завершение, обычно продолжается после разрешения исключенияmake. Автор начал тупить, чтобы каждый раз решать исключение, а потомmake clean,Сноваmake.
Разрешите ошибки компиляции
-
cannot find -lstdc++-lпредставляет библиотеку,cannot find -lXXX, что обычно означает отсутствиеlibXXXбиблиотека. Посмотрите в Интернете и скажите, что он отсутствуетlibstdc++-static, но автор рекомендует лучшеyum search libstdc*Результаты поискаyum installСпускайся, не так уж и много. -
libjvm.soБесконечный цикл мягкого соединения/usr/bin/ld: cannot open output file libjvm.so: Too many levels of symbolic links collect2: error: ld returned 1 exit status ln: failed to access 'libjvm.so': Too many levels of symbolic links ln: failed to access 'libjvm.so.1': Too many levels of symbolic links /usr/bin/objcopy --only-keep-debug libjvm.so libjvm.debuginfo /usr/bin/objcopy: Warning: could not locate 'libjvm.so'. reason: Too many levels of symbolic linksНе обязательно сначала
make clean,после этогоmake sanity,make -
проблема более десяти лет
Error: time is more than 10 years from present: 1136059200000 java.lang.RuntimeException: time is more than 10 years from present: 1136059200000 at build.tools.generatecurrencydata.GenerateCurrencyData.makeSpecialCaseEntry(GenerateCurrencyData.java:285) at build.tools.generatecurrencydata.GenerateCurrencyData.buildMainAndSpecialCaseTables(GenerateCurrencyData.java:225) at build.tools.generatecurrencydata.GenerateCurrencyData.main(GenerateCurrencyData.java:154)Исправлять
openjdk//jdk/src/share/classes/java/util/CurrencyData.properties, и измените место, где год представлен на год, который находится не более чем в 10 годах от этого года:- Изменить строку 108 AZ=AZM;2015-12-31-20-00-00;AZN
- Изменить строку 381 МЗ=МЗМ;2015-06-30-22-00-00;МЗН
- Изменить строку 443 RO=ROL;2015-06-30-21-00-00;RON
- Изменить строку 535 TR=TRL;2015-12-31-22-00-00;TRY
- Изменить строку 561 ВЭ=ВЭБ;2015-01-01-04-00-00;ВЭФ
-
Отсутствуют заголовочные файлы C
fatal error: X11/Intrinsic.h: No such file or directory # include <X11/Intrinsic.h>/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory compilation terminated. make: *** [bitmap.o] Error 1Процедура 3: Если вам будет предложено, что вы пропали без вести
xxx/xxx.h,можно использоватьyum provides */xxx.hПосмотрите, в какую библиотеку включен заголовочный файл, и используйте полное имя библиотеки какyum installСкачать параметры
Я хочу поставить яму, которую я наступаю на автора, но информация о выводе компиляции слишком сложна, чтобы найти следы пикировки. В общем, это не отсутствие зависимости, это уже зависимость от нее (на данный момент вам нужны версии 32/64)
Скомпилирован с помощью JDK.
После успешной компиляцииopenjdk/build/linux-amd64/j2sdk-imageкомпилируетсяjdkкорневой каталог:
[root@pinyoyougou-docker j2sdk-image]# bin/java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-root_2019_01_23_14_04-b00)
OpenJDK 64-Bit Server VM (build 24.75-b04, mixed mode)
Ссылка на ссылку
- «Углубленное понимание виртуальной машины Java (2-е издание)»
- GitHub.com/bear весь…