- PVSM.RU - https://www.pvsm.ru -
В последнее время со сборкой JDK в Windows всё стало хорошо и приятно, поэтому поделюсь радостью и распишу, как это делается.
Каждый второй, кто пытается собрать что-то под Windows, получет глубокую психологическую травму, и заранее ожидает от сборки следующих эмоций:
Что касается JDK, если не сходить с пряничной дорожки, делать в точности как в этой инструкции, проблем не будет. Возможные проблемы обозначены в тексте.
Общий смысл происходящего: устанавливаем компиляторы (JDK8, Visual Studio 2013), среду сборки (GNU/Cygwin) и набор стандартных пакетов для неё, собираем из исходников Freetype, заливаем репозиторий JDK, configure, make, java -version.
Мы будем собирать Java и C++ (раз вы читаете эту статью, то, наверное, уже в курсе), поэтому на микроволновке лучше сборкой не заниматься. Нужна рабочая станция или ноутбук с нормальным процессором, и, желательно, SSD вместо жесткого диска для сборочной директории проекта. Кроме сборки, какое-то время потратится на скачивание исходника и установку Visual Studio.
Понадобится подключение к интернету и права администратора Windows. Проблемы пользователей корпоративной инфраструктуры, где всего этого нет, здесь не рассматриваются.
для бута.
Ссылка на загрузку:
www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html [1]
(версия Express подойдёт).
Ссылка на загрузку:
www.microsoft.com/ru-ru/download/details.aspx?id=44914 [2]
Если вы устанавливаете полную версию, то при установке вам дадут выбор компонентов: достаточно установить только те компоненты, которые относятся к C++ и Windows SDK.
При установке Express, никакого выбора не будет — к счастью, оно само устанавливает именно то, что нам нужно. Это выглядит как-то так:
![]() |
![]() |
После установки, обязательно нужно перезагрузить операционную систему.
Важно: нужно установить именно Visual Studio 2013.
Не ниже потому, что о версии 2013 говорится в Build Readme.
Не выше потому, что если попробовать провести сборку с установленной Visual Studio 2015, то сборщик JDK будет видеть компилятор, но будет ломаться с ошибкой:
C compiler cannot create executables
Если заглянуть в config.log, становится понятна причина:
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
Если тупо сделать
export LINK="/NODEFAULTLIB:libcmt.lib"
то оно развалится:
unresolved external symbol mainCRTStartup.
Если кто-то в комментариях знает, как безболезненно починить эту ошибку и запуститься на 2015, буду очень благодарен. Неприятно быть залоченным на устаревшую версию компилятора, даже если она бесплатная.
Ссылка на загрузку: www.cygwin.com [3]
Важно: сейчас принято использовать msys2 вместо Cygwin.
К сожалению, сборка JDK тут же упадет с ошибкой:
configure: error: /usr/bin/bash /x/git/openjdk9/common/autoconf/build-aux/config.sub x86_64-pc-msys failed
Если попытаться прописать msys так же, как там прописан Cygwin, то ошибка меняется:
unsupported operating system msys
Если какой-нибудь герой в комменатриях расскажет, как правильно прописать msys, это было бы здорово.
, описанные в Build Readme.
В скобках указана категория пакета, после знака "—" ради чего мы это ставим.
Назначение каждого экзешника можно почитать в мане, но чтобы собрать этого знать не нужно.
Для возмущенных таким большим набором зависимостей — скажите спасибо, что не заставили устанавливать Python и Ruby! :)
Для тех, кто ни разу не сталкивался с Cygwin пара замечаний:
В прошлых инструкциях часто предполагалось скачать и прописать свой make.
По новейшим наблюдениям, делать этого не имеет смысла, того make что установился пакетом в Cygwin — вполне достаточно.
Более того, на официальном сайте лежит устаревшая версия make, поэтому с ней вы получите ошибку типа:
The specified make (by MAKE=/cygdrive/c/Program Files (x86)/GnuWin32/bin/make.exe) is not GNU make 4.0 or newer.
То есть, make вам придется или собирать вручную, или искать уже собранный на сомнительных файлопомойках, как когда-то мы подбирали на них rpm’ки.
Если собственный make вам действительно нужен, то чтобы его использовать, нужно прописать в configure параметр MAKE=/путь/до/make.exe
.
Да, другие параметры начинаются на --, например --with-freetype, а вот MAKE должен быть именно в таком виде.
Если оно вам действительно нужно (Java 3D?), вы об этом знаете, и знаете что делать.
Здесь инструкций не будет.
Собирать FreeType обязательно, даже если очень не хочется и лично вам не нужно.
Там две группы загрузок: две вверху (Complete package и Sources), и шесть пониже (Binaries… Original source). Элемент Sources есть в обеих группах. Нам нужно скачать зипник элемента Sources из второй группы.
Замечание:
Качает сто лет, что делать?
Ничего не поделаешь, это Сорсфордж. В момент отображения таймера загрузки попробуйте успеть щелкнуть по ссылке try another mirror и выберите что-нибудь во Франции. Французы не жмотятся на скорость.
Повторяем действия:
В Solution Explorer, правой кнопкой на проект freetype, properties.
Указываем Output Directory: src/freetype/2.3.5/freetype-2.3.5/lib
Проверяем, что configuration type выставлен в Dynamic library (.dll)
Закрываем окно freetype Property Pages.
Собираем проект через Build -> Build solution.
Ключевой факт тут такой: теперь у нас в одной корневой директории (src/freetype/2.3.5/freetype-2.3.5) лежат и инклуды (src/freetype/2.3.5/freetype-2.3.5/include), и библиотеки (src/freetype/2.3.5/freetype-2.3.5/lib).
Запоминаем, куда скачали (например: C:/opt/trees.py)
Важно
Согласно инструкциям отсюда:
openjdk.java.net/projects/code-tools/trees [8]
Мы должны были бы загружать вот этот файл:
hg.openjdk.java.net/code-tools/trees/raw-file/tip/trees.py [9]
К сожалению, на момент написания статьи, интеграция этого экстеншена с новой версией Mercurial сломана.
Есть следующий баг, с приложенным патчем:
bugs.openjdk.java.net/browse/CODETOOLS-7901672 [10]
Чтобы вам не патчить trees самостоятельно, я пропатчил его, и выложил здесь:
gist.githubusercontent.com/olegchir/8267049ed48f7975aa8ef7d7c1515349/raw/fbe90ac1c639f6c209bc7cebbdcc7ebbd848c734/trees.py [7]
В будущем, когда этот тикет будет закрыт, стоит использовать основную версию.
Если вы читаете эту инструкцию, когда тикет уже закрыт – напишите мне, я исправлю этот пункт.
Так как Windows плохо относится к созданию файлов, начинающихся на точку, проще всего открыть консоль Cygwin и выполнить команду:
touch /cygdrive/c/Users/olegchir/.hgrc
Внутри файла пишем:
[extensions]
purge =
trees = C:opttrees.py
Слеши в пути до py-файла – обратные.
Важно
В будущем ссылка может измениться.
Смотреть новую ссылку можно здесь: openjdk.java.net/guide/repositories.html [12]
Важно
Постарайтесь установить в путь с как можно более коротким имененем, например: C:/hg. Это поможет избежать ошибок с излишне длинными именами файлов, которые не может обработать проводник Windows (NTFS уже иногда может их обрабатывать, а Проводник – еще нет). Поможет не попасть в глупую ситуацию, когда репозиторий вы уже склонировали, а удалить его — еще не можете.
Неприятненько
При возникновении ошибки «abort: stream ended unexpectedly».
Вначале попробуйте перезапустить hg tclone еще несколько раз.
Если ошибка продолжает повторятся, то вам предстоит муторная ручная работа.
Запомните, какой проект не выгружался до конца (например, langtools)
Перезапустите всё с таким аргументом:
hg tclone -r 100 hg.openjdk.java.net/jdk9/dev [11] 9dev
Это загрузит только 100 ченжсетов и даст возможность операции tclone завершиться.
Сразу после этого перейдите в директорию проекта, который не докачался (например, langtools), и выполните hg tpull -u 1000.
И дальше добавляйте по 1000 ченжсетов:
hg tpull -u 1000
hg tpull -u 2000
hg tpull -u 3000
Когда ревизии закончатся – нужно перейти в корень (9dev), и выполнить там команду “hg tpull -u” (без указания количества ревизий).
Если после этого упадёт тот же проект – перейдите в него назад, и с более маленьким шагом докачайте оставшиеся ревизии совсем точно до конца, вернитесь в корень и повторите hg tpull -u без аргументов.
Если после этого упадёт другой проект – переходим в его директорию, и повторяем пока всё не склонируется до конца.
./configure --enable-debug --with-target-bits=64 --with-boot-jdk=/cygdrive/c/opt/Java/jdk1.8.0_111 --with-freetype=/cygdrive/c/my/opt/java/freetype-2.3.5-1-src/src/freetype/2.3.5/freetype-2.3.5
пути до файлов должны совпадать с теми, что мы получили в ходе выполнения инструкции:
--with-boot-jdk указывает на директорию, куда вы загрузили JDK8
--with-freetype указывает на директорию внутри исходников freetype, где есть поддиректории include и lib, и в lib вы собрали .dll и .lib с 64-битным фритайпом
пути до файлов обязаны быть не родными, а начинаться с /cygdrive.
Единственная ожидаемая ошибка — при использовании Visual Studio Express:
Cannot locate a valid Visual Studio or Windows SDK installation on disk
Обычно её можно исправить небольшим грязным хаком.
Заходим в директорию установки MSVS (обычно это C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC).
Видим что там нет диерктории amd64, зато есть x86_amd64.
Копируем её с новым названием: amd64.
Заходим внутрь amd64, и копируем файл vcvarsx86_amd64.bat с новым именем: vcvars64.bat
Перезапускаем configure с новым параметром: --with-tools-dir:
./configure --enable-debug --with-target-bits=64 --with-boot-jdk=/cygdrive/c/opt/Java/jdk1.8.0_111 --with-freetype=/cygdrive/c/my/opt/java/freetype-2.3.5-1-src/src/freetype/2.3.5/freetype-2.3.5 --with-tools-dir="C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/bin/amd64"
Configuration summary:
* Debug level: fastdebug
* HS debug level: fastdebug
* JDK variant: normal
* JVM variants: server
* OpenJDK target: OS: windows, CPU architecture: x86, address length: 64
* Version string: 9-internal+0-adhoc.olegchir.openjdk9 (9-internal)
Tools summary:
* Environment: cygwin version 2.6.1(0.305/5/3) (root at /cygdrive/c/cygwin)
* Boot JDK: java version «1.8.0_111» Java(TM) SE Runtime Environment (build 1.8.0_111-b14) Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode) (at /cygdrive/c/opt/Java/jdk1.8.0_111)
* Toolchain: microsoft (Microsoft Visual Studio 2013)
* C Compiler: Version 18.00.40629 (at /cygdrive/c/progra~2/micros~2.0/vc/bin/amd64/cl)
* C++ Compiler: Version 18.00.40629 (at /cygdrive/c/progra~2/micros~2.0/vc/bin/amd64/cl)
Build performance summary:
* Cores to use: 8
* Memory limit: 20447 MB
Внутри диретктории с исходниками должна появиться директория builds/windows-x86_64-normal-server-fastdebug
С помощью консоли (cmd.exe) заходим в каталог типа:
X:gitopenjdk9buildwindows-x86_64-normal-server-fastdebugjdkbin
И выполняем команду: java -version
Должна быть распечатана версия 9-internal.
In open source no one can hear your scream
Автор: olegchir
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/230729
Ссылки в тексте:
[1] www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[2] www.microsoft.com/ru-ru/download/details.aspx?id=44914: https://www.microsoft.com/ru-ru/download/details.aspx?id=44914
[3] www.cygwin.com: https://www.cygwin.com/
[4] gnuwin32.sourceforge.net/packages/freetype.htm: http://gnuwin32.sourceforge.net/packages/freetype.htm
[5] technet.microsoft.com/ru-ru/sysinternals/processexplorer.aspx: https://technet.microsoft.com/ru-ru/sysinternals/processexplorer.aspx
[6] tortoisehg.bitbucket.org/download/index.html: http://tortoisehg.bitbucket.org/download/index.html
[7] gist.githubusercontent.com/olegchir/8267049ed48f7975aa8ef7d7c1515349/raw/fbe90ac1c639f6c209bc7cebbdcc7ebbd848c734/trees.py: https://gist.githubusercontent.com/olegchir/8267049ed48f7975aa8ef7d7c1515349/raw/fbe90ac1c639f6c209bc7cebbdcc7ebbd848c734/trees.py
[8] openjdk.java.net/projects/code-tools/trees: http://openjdk.java.net/projects/code-tools/trees/
[9] hg.openjdk.java.net/code-tools/trees/raw-file/tip/trees.py: http://hg.openjdk.java.net/code-tools/trees/raw-file/tip/trees.py
[10] bugs.openjdk.java.net/browse/CODETOOLS-7901672: https://bugs.openjdk.java.net/browse/CODETOOLS-7901672
[11] hg.openjdk.java.net/jdk9/dev: http://hg.openjdk.java.net/jdk9/dev
[12] openjdk.java.net/guide/repositories.html: http://openjdk.java.net/guide/repositories.html
[13] Источник: https://habrahabr.ru/post/319078/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.