2013-05-28 3 views
2

У нас есть файл свойств (например, db.properties), который содержит учетные данные для доступа к базе данных. Пример:Обработка пользовательских свойств с помощью ant

db.jdbc.user=johndoe 
db.jdbc.password=topsecret 

У нас есть много скриптов ant, которые читают этот файл и выполняют различные задачи. Пример:

<!--Initialize the environment--> 
<target name="environment"> 

<!--Read database connection properties--> 
    <property file="$../db.properties"/> 
    ... 
</target> 

<target name="dbping" 
    description="Test the database connectivity with the current settings." 
    depends="environment"> 
    ... 
    <sql driver="oracle.jdbc.OracleDriver" 
     url="${db.jdbc.url}" 
     userid="${db.jdbc.user}" 
     password="${db.jdbc.password}" 
     classpathref="classpath.jdbc" 
     print="true" 
     showheaders="false"> 
     SELECT 'JDBC connect: successful!' FROM dual; 
    </sql> 

    ... 
</target> 

Теперь клиент хочет, чтобы пароль в db.Properties шифруется с помощью их шифрования LIB при условии внутри .jar файла, например:

db.jdbc.user=johndoe 
db.jdbc.password.encrypted=true 
db.jdbc.password=018Dal0AdnE=|ySHZl0FsnYOvM+114Q1hNA== 

То, что мы хотим, чтобы добиться дешифрации с минимальными изменениями в тоннах файлов ant. Я слышал об улучшенной обработке свойств в Ant 1.8, но мы используем Ant 1.7.1.

Какое оптимальное решение для этого - обычная задача, какая-то магия с экземпляром PropertyHelper, что-то еще?

Заранее благодарим за ваши намеки.

ответ

1

Решение, которое я предпочитаю, состоит в том, чтобы справиться с этой проблемой с моей собственной задачей. Это потребовало минимальных изменений. В нашем скрипте для муравьев эта задача выглядит так:

<!--Initialize the environment--> 
<target name="environment"> 

    <!--Read database connection properties--> 
    <property file="$../db.properties"/> 
    ... 

    <decryptpwd passwordProperty="db.jdbc.password"/> 

</target> 

Задача также тривиальна. Это выглядит следующим образом:

public class DecryptPassword extends Task 
{ 
    @Override 
    public void execute() 
    { 
     ... 
     PropertyHelper.getPropertyHelper(getProject()).setProperty(null, passwordProperty, getDecryptedPassword(), 
          false); 
     ...     
    } 
} 

И Yeap - это, кажется, работает ;-)

+0

См. Этот ответ для аналогичного подхода: http://stackoverflow.com/questions/7503630/where-do-i-put-my-credentials-when-using-ivy-and-a-private-company-repository/7505364# 7505364 –

1

Я думаю, что подход, который вы хотите принять, - это подход обертки, который вы можете сделать в муравье.

родитель муравей сценарий:

<target name="decrypt">  
    <exec executable="myJar"> 
    <arg value="encryptedString"/> 
    </exec> 
</target> 
    <target name="build-foo"> 
     <subant target="build"> 
      <fileset dir="${test.home}" includes="Foobuild.xml"/> 
     </subant> 
    </target> 

    <target name="build-bar"> 
     <subant target="build"> 
      <fileset dir="${test.home}" includes="Barbuild.xml"/> 
     </subant> 
    </target> 

использование subant
и exec (ПОТЕНЦИАЛЬНО ОПАСНЫЕ)

То, что вы хотите сделать, это падение каждого из индексов в этот родительский файла сборки и огибают незашифрованную строку для каждого из скриптов в качестве параметра/чтения из свойства.

+0

Спасибо! Все эти индексы являются самодостаточными единицами, которые зависят только от цели, которая задает некоторые переменные среды. Они тестируют подключение к db, импорту, экспорту и т. Д. В настоящее время я предпочитаю свою собственную задачу, которую я поставлю в целевую среду. Эта задача расшифрует пароль, и использование PropertyHelper предоставит расшифрованную версию для других целей. –

Смежные вопросы