Персональный технический блог: 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=C
WARNING: 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 весь…