Как определить архитектуру сборки (32 бит / 64 бит) с помощью ant?

Мы унаследовали файл сборки ant, но теперь его нужно развернуть как в 32-битных, так и в 64-битных системах.

Биты, отличные от Java, выполняются с помощью GNUMakefiles, где мы просто вызываем uname для получения информации. Есть ли аналогичный или даже более простой способ имитировать это с помощью ant?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
0
25 684
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Вы можете просто передать параметр в файл сборки с нужным значением. Например, если ваша цель - dist:

ant -Dbuild.target=32 dist

или же

ant -Dbuild.target=64 dist

а затем в сценарии сборки Ant выполните различные действия в зависимости от значения свойства ${build.target} (вы также можете использовать условия для установки значения по умолчанию для свойства, если оно не задано).

Или вы можете проверить значение встроенныйсвойства системы, например ${os.arch}.

os.arch работает не очень хорошо, другой подход - это запрос JVM, например:

    ~$ java -d32 test
    Mon Jun 04 07:05:00 CEST 2007
    ~$ echo $?
    0
    ~$ java -d64 test
    Running a 64-bit JVM is not supported on this platform.
    ~$ echo $?
    1

Это должно быть в сценарии или в оболочке.

У меня он работал под Linux, но, похоже, не работает под Windows.

Luis Soeiro 23.01.2012 17:41

Предполагая, что вы используете ANT для создания Java-приложения, зачем вам знать, 32-битная это архитектура или 64-битная? Мы всегда можем передать параметры задачам ant. Более чистый способ - программно создать файл системных свойств, используемый Ant, перед вызовом фактической сборки. Есть такой интересный пост http://forums.sun.com/thread.jspa?threadID=5306174.

Ссылка на ветку оборвалась, когда Oracle захватила форумы Java. Сможете найти ветку и исправить ссылку?

Jim Garrison 24.06.2011 21:11
Ответ принят как подходящий

вы можете получить свойства системы Java (http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties ()) из ant с помощью $ {os.arch}. другие интересующие свойства могут быть os.name, os.version, sun.cpu.endian и sun.arch.data.model.

Спасибо, это звучит как самый разумный подход. Попробую это.

HD. 21.10.2008 16:15

Осторожно - $ {os.arch} сообщает вам только битность JVM, но не платформу. См. Ответ @phatypus.

Dan Gravell 18.12.2011 18:24

Поздно на вечеринку, но какого черта ...

$ {os.arch} только сообщает вам, является ли JVM 32/64-битной. Возможно, вы используете 32-битную JVM в 64-битной ОС. Попробуй это:

<var name  = "os.bitness" value  = "unknown"/>
<if>
<os family = "windows"/>
<then>
    <exec dir = "." executable = "cmd" outputproperty = "command.ouput">
        <arg line = "/c SET ProgramFiles(x86)"/>
    </exec>
    <if>
        <contains string = "${command.ouput}" substring = "Program Files (x86)"/>
        <then>
            <var name  = "os.bitness" value  = "64"/>
        </then>
        <else>
            <var name  = "os.bitness" value  = "32"/>
        </else>
    </if>
</then>
<elseif>
    <os family = "unix"/>
    <then>
        <exec dir = "." executable = "/bin/sh" outputproperty = "command.ouput">
        <arg line = "/c uname -m"/>
        </exec>
        <if>
            <contains string = "${command.ouput}" substring = "_64"/>
            <then>
                <var name  = "os.bitness" value  = "64"/>
            </then>
            <else>
                <var name  = "os.bitness" value  = "32"/>
            </else>
        </if>
    </then>
</elseif>
</if>

<echo>OS bitness: ${os.bitness}</echo>

Обновлено: Как отметил @GreenieMeanie, для этого требуется библиотека ant-contrib от ant-contrib.sourceforge.net

Я не могу найти свойство среды, которое работает во всех версиях Windows. Например, ProgramFiles (x86) не существует под Windows 2000 или Windows XP ... Для Linux он отлично работал. Есть другие мысли по этому поводу?

Luis Soeiro 23.01.2012 17:43

На самом деле, если я правильно читаю его сценарий, он полагается на тот факт, что переменная среды ProgramFiles (x86) не существует в 32-битной Windows.

Mike Nelson 14.02.2012 21:13

@LuisSoeiro - сценарий работал у меня на той ОС, которую я использовал в то время; У меня сейчас нет экземпляров Windows 2000 или XP для тестирования. Если у вас проблемы с PROGRAMFILES (x86), существует ли PROCESSOR_ARCHITECTURE во всех других ОС MS? Вы всегда можете изменить часть скрипта для Windows, чтобы он проверял, существует ли каталог C: \ Program Files (x86) \ - если он существует, вы используете 64-разрядную версию, если нет - 32-разрядную версию.

phatypus 28.02.2012 09:41

Просто обратите внимание, что для использования вышеуказанного синтаксиса требуется библиотека ant-contrib через ant-contrib.sourceforge.net

GreenieMeanie 25.06.2013 22:54

спасибо, Грини, потому что извините за то, что я причиняю боль, но это совершенно бесконтекстно и, следовательно, бесполезно - КАК вы МОГЛИ запустить это? Это не похоже на то, что я когда-либо видел, похоже на какую-то разметку. Если мне нужно знать, какая архитектура муравьев, почему мне нужно понимать, «как использовать муравей», много стрелок вниз, пожалуйста?

user26676 02.01.2014 16:52

МЕЖДУ, os.arch (свойство arch тега os), которое я получил для 64-разрядного Linux, был amd64.

Вот ответ, который работает (я тестировал на Kubuntu 64, Debian 32, Windows 2000 и Windows XP) без необходимость внешних или дополнительных зависимостей ANT. Это было основано на ответе @phatypus.

<project name = "FindArchitecture" default = "check-architecture" basedir = ".">

    <!-- Properties set: unix-like (if it is unix or linux), x64 (if it is 64-bits),
         register- size (32 or 64) -->
    <target name = "check-architecture" depends = "check-family,check-register" >
        <echo>Register size: ${register-size}</echo>
        <echo>OS Family: ${os-family}</echo>
    </target>

    <target name = "check-family" >
        <condition property = "os-family" value = "unix" else = "windows">
            <os family = "unix" />
        </condition>

        <condition property = "unix">
            <os family = "unix" />
        </condition>
    </target>

    <target name = "check-register" depends = "reg-unix,reg-windows">
    </target>

    <!-- Test under GNU/Linux -->
    <target name = "reg-unix" if = "unix">
        <exec dir = "." executable = "uname" outputproperty = "result">
            <arg line = "-m"/>
        </exec>

        <!-- String ends in 64 -->
        <condition property = "x64">
            <matches string = "${result}" pattern = "^.*64$"/>
        </condition>

        <condition property = "register-size" value = "64" else = "32">
            <isset property = "x64"/>
        </condition>
    </target>

    <!-- Test under MS/Windows-->
    <target name = "reg-windows" unless = "unix">
        <!-- 64 bit Windows versions have the variable "ProgramFiles(x86)" -->
        <exec dir = "." executable = "cmd" outputproperty = "result">
            <arg line = "/c SET ProgramFiles(x86)"/>
        </exec>

    <!-- String ends in "Program Files (x86)" -->
        <condition property = "x64">
            <matches string = "${result}" pattern = "^.*=.*Program Files \(x86\)"/>
        </condition>

        <condition property = "register-size" value = "64" else = "32">
            <isset property = "x64"/>
        </condition>
    </target> 
</project>

Другие вопросы по теме