Скомпилируйте OpenJDK самостоятельно

Java

Персональный технический блог: 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этот шаг можно пропустить)

  1. Установить переменные среды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
    
  2. 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
    
  3. Отсутствующие зависимости сборки

    ERROR: The Compiler version is undefined.
    

    решать:

    [root@pinyoyougou-docker openjdk]# yum install gcc gcc-c++
    
  4. отменить существующие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
    
  5. отсутствие зависимостей звуковой карты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, а затем в списке результатов поиска используйте подстановочные знаки суффикса для загрузки зависимостей с тем же префиксом одним щелчком мыши.

  6. Недостаток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, чтобы не всегда спрашивать, уверены ли вы в установке.

  7. Так что я тогда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
    
  8. 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

Что нужно обратить внимание на:

  1. должен быть установленLANG=C,будетALT_BOOTDIRустановлен вboostrap jdkкорневой каталог
  2. Если ваша система была настроена ранееjdkПеременные среды должны быть здесьunset(Вышеупомянутый сначала40,41Ряд)
  3. Указанное выше количество параллельных потоков является вашим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.

Разрешите ошибки компиляции

  1. cannot find -lstdc++

    -lпредставляет библиотеку,cannot find -lXXX, что обычно означает отсутствиеlibXXXбиблиотека. Посмотрите в Интернете и скажите, что он отсутствуетlibstdc++-static, но автор рекомендует лучшеyum search libstdc*Результаты поискаyum installСпускайся, не так уж и много.

  2. 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

  3. проблема более десяти лет

    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;ВЭФ
  4. Отсутствуют заголовочные файлы 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 весь…