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




Вы можете просто передать параметр в файл сборки с нужным значением. Например, если ваша цель - 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
Это должно быть в сценарии или в оболочке.
Предполагая, что вы используете ANT для создания Java-приложения, зачем вам знать, 32-битная это архитектура или 64-битная? Мы всегда можем передать параметры задачам ant. Более чистый способ - программно создать файл системных свойств, используемый Ant, перед вызовом фактической сборки. Есть такой интересный пост http://forums.sun.com/thread.jspa?threadID=5306174.
Ссылка на ветку оборвалась, когда Oracle захватила форумы Java. Сможете найти ветку и исправить ссылку?
вы можете получить свойства системы 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.
Спасибо, это звучит как самый разумный подход. Попробую это.
Осторожно - $ {os.arch} сообщает вам только битность JVM, но не платформу. См. Ответ @phatypus.
Поздно на вечеринку, но какого черта ...
$ {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 он отлично работал. Есть другие мысли по этому поводу?
На самом деле, если я правильно читаю его сценарий, он полагается на тот факт, что переменная среды ProgramFiles (x86) не существует в 32-битной Windows.
@LuisSoeiro - сценарий работал у меня на той ОС, которую я использовал в то время; У меня сейчас нет экземпляров Windows 2000 или XP для тестирования. Если у вас проблемы с PROGRAMFILES (x86), существует ли PROCESSOR_ARCHITECTURE во всех других ОС MS? Вы всегда можете изменить часть скрипта для Windows, чтобы он проверял, существует ли каталог C: \ Program Files (x86) \ - если он существует, вы используете 64-разрядную версию, если нет - 32-разрядную версию.
Просто обратите внимание, что для использования вышеуказанного синтаксиса требуется библиотека ant-contrib через ant-contrib.sourceforge.net
спасибо, Грини, потому что извините за то, что я причиняю боль, но это совершенно бесконтекстно и, следовательно, бесполезно - КАК вы МОГЛИ запустить это? Это не похоже на то, что я когда-либо видел, похоже на какую-то разметку. Если мне нужно знать, какая архитектура муравьев, почему мне нужно понимать, «как использовать муравей», много стрелок вниз, пожалуйста?
МЕЖДУ, 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>
У меня он работал под Linux, но, похоже, не работает под Windows.