Mac против Windows: чтение переменной среды в файлах сборки Ant

#java #ant

#java #ant

Вопрос:

У меня есть проект, который ссылается на переменные среды в файле сборки Ant.

 <property environment="env" />
<!-- RESOLVE -->
<target name="{target}">
    <if>
        <isset property="env.MY_HOME"/>
        <then>
            <property name="my.home" value="${env.MY_HOME}"/>
        </then>
        <else>
            <property name="my.home" value="${env.USERPROFILE}/me"/>
        </else>
    </if>   
</target>
  

Другим разработчикам на компьютерах с Windows даже не нужно определять env.IVY_HOME env.USERPROFILE переменные or . Но я, как пользователь Mac, получаю следующую ошибку во время процесса сборки:

 settings file does not exist
  

Теперь я успешно добавил и повторил IVY_HOME и даже USERPROFILE в моем .bash_profile файле, но я все еще получаю ту же ошибку.


ОБНОВЛЕНИЕ: даже переменные среды в моем pom.xml их не читают:

 <systemPath>${env.JAVA_HOME}/lib/myJarFile.jar</systemPath> 
  

Если я внесу изменения в свой build.xml файл, даже мой репозиторий, не обнаруживает, что файл был изменен. Почему это должно быть? Я предполагаю, что свойства ANT неизменяемы.

Я должен жестко указать путь, чтобы заставить его работать:

 <systemPath>{pathToMyJar}</systemPath>
  

Почему я, как пользователь Mac, столкнулся с этой проблемой, тогда как пользователям Windows даже не нужно устанавливать переменные среды, и они все равно могут нормально работать?


ОБНОВЛЕНИЕ: это работает для моих коллег из Windows, потому что существует переменная среды USERPROFILE по умолчанию. Но на Mac эквивалент $HOME . Как я могу это исправить? Я пробовал export USERPROFILE=$HOME в своих .profile .bash_profile файлах and, но он все еще пытается читать env.USERPROFILE .

Вот он mybuild.xml (я думаю, другой файл ant, который запускается для локальной разработки build.xml ):

 <target name="init-my-stuff">
    <if>
        <isset property="env.MY_HOME"/>
        <then>
            <property name="my.home" value="${env.MY_HOME}"/>
        </then>
        <else>
            <property name="my.home" value="${env.USERPROFILE}/me"/>
        </else>
    </if>   

</target>
  

Комментарии:

1. Для доступа к среде с использованием префикса env ваша сборка должна <property environment="env" /> быть где-то включена. Возможно, по какой-то причине это выполняется только для пользователей Windows вашего файла сборки.

2. У меня это есть; извините, я обновлю тикет.

3. Может зависеть от того, как запускается Ant — различия в .bashrc и .bash-profile, если вы понимаете, что я имею в виду?

4. Вы экспортировали свою переменную IVY_HOME? добавьте <echoproperties>, чтобы увидеть, какие свойства у вас действительно есть ant.apache.org/manual/Tasks/echoproperties.html .

5. Пожалуйста, не создавайте больше работы для других людей, вандализируя ваши сообщения. Размещая в сети Stack Exchange, вы предоставляете Stack Exchange не подлежащее отзыву право в соответствии с лицензией CC BY-SA 4.0 на распространение этого контента (т. Е. Независимо от ваших будущих решений). Согласно политике обмена стеками, распространяется версия post, не подвергшаяся вандализму. Таким образом, любой вандализм будет отменен. Если вы хотите узнать больше об удалении записи, пожалуйста, смотрите: Как работает удаление?

Ответ №1:

Этот пример работает на моем Mac. Аналогично build.xml тому, что указано в вашем вопросе. Я использую Ant 1.9.6, Ivy 2.5.0 и Ant Contrib 1.0b3.

Для тестирования я использую следующее run.sh в Bash. Это довольно простой, поэтому это будет полезный тест, чтобы увидеть, работает ли он для вас:

 #!/bin/bash

unset IVY_HOME
unset USERPROFILE

# try either of these:
# export IVY_HOME=~/tools/apache-ivy/apache-ivy-2.5.0
export USERPROFILE=~/tools/apache-ivy/apache-ivy-2.5.0

ant init-ivy 
  

Конечно, вам придется изменить пути, чтобы они были специфичны для вашей машины. Закомментировав IVY_HOME or соответствующим USERPROFILE образом, Ant будет использовать ветвь <then> or <else> , как и ожидалось.

Комментарии:

1. Спасибо за ответ, но по какой-то причине, хотя я правильно настраиваю переменные среды, он все равно ищет env.USERPROFILE . Я обновил исходное сообщение с целью, которая проверяет наличие этой переменной.

Ответ №2:

Да, свойства ant неизменяемы. После установки они больше не могут быть изменены. Есть способы обойти это — вы можете установить переменную только для одной цели, используя <local> задачу. например, или используйте макросы, но это, похоже, не имеет отношения к вашему вопросу, поэтому давайте перейдем к загадке отсутствующей env.IVY_HOME переменной.

В частности, в linux / mac каждый процесс получает совершенно новую свежую «среду» (в терминах Java, в основном a Map<String, String> ), которая может быть инициализирована для хранения множества дополнительных значений, если порождающий процесс решит, что он хочет это сделать.

Ключевым моментом является то, что если ваш bash сообщает вам, что IVY_HOME существует, это не означает, что ваш процесс ant увидит это!

Это то export , для чего нужно; если вы установите свойство как with, IVY_HOME=.... тогда ваша оболочка не будет копировать его в какие-либо вновь созданные процессы. Если вы вставляете export впереди, он должен. Достаточно простой тест — создать bash из вашего ant и попросить его распечатать все свойства:

 <project name="test" default="test">
  <target name="test">
    <exec executable="/bin/bash">
      <arg value="-c" />
      <arg value="set" />
    </exec>
  </target>
</project>
  

Инструкции: Сохраните вышеуказанное build.xml в новом каталоге, затем запустите ant .

запустите приведенное выше, и я уверен, что IVY_HOME, USERPROFILE и т. Д. Отсутствуют в списке в первую очередь, Что говорит о том, что вы не «устанавливали» эти свойства в первую очередь. Либо вы их не экспортировали, либо столкнулись с другой проблемой — концепцией «интерактивных переменных» и «неинтерактивных переменных». Это не встроено в систему sysenv, а в большинство настроек оболочек linux / mac: существует целая куча сценариев оболочки, которые считываются при запуске новой оболочки. Иногда ~/.bashrc ~/.profile etc/bash_profile /etc_profile есть /etc/profile.d каталог со многими сценариями и многое другое.

Какие из них на самом деле вызываются при запуске оболочки, зависит от того, какую оболочку вы запускаете, и является ли она «интерактивной» или нет. Вполне возможно, что вы добавили export IVY_HOME=.... в файл, который даже не считывается.

Вероятно, следует ввести переменные среды, которые вы хотите получить глобально доступными ~/.profile .

Вы всегда можете указать bash, чтобы он специально передал некоторые переменные env вашему процессу. Попробуйте это:

 FOO=hello ant
  

в том же каталоге, что и вызов bash -c, установленный в качестве тестового сценария выше. Это один из способов, которым вы можете решить проблему; выполнив IVY_HOME=/path/to JAVAHOME=/path/to ant build или что-то еще (любая строка, разделенная знаком равенства, помещенная перед командой, сообщает bash поместить эту пару ключ / значение в хэш-карту, которую он создает для этого процесса).

Если это последнее по-прежнему не приводит к тому, что ваш ant-скрипт запускается env.IVY_HOME , значит, происходит что-то действительно странное, и, я думаю, пришло время вставить полный скрипт.

Комментарии:

1. спасибо за очень подробный ответ. я не могу запустить тест, потому что у меня не установлен ant. но я думаю, что у меня есть идея относительно того, почему это работает для моих коллег из Windows, а не для меня, потому что Windows имеет переменную среды USERPROFILE по умолчанию. Но newbuild.xml файл (запускается каким-то образом с помощью build.xml ) все еще пытается прочитать env.USERPROFILE, и я не знаю почему.

2. Я ценю ваш ответ, и хотя я все еще борюсь с этим, ваш ответ помог мне приблизиться к источнику проблемы. Итак, я присужду вам награду.