2010-07-12 3 views
44

Есть ли способ (я имею в виду, как я) установить системное свойство в проекте maven?Задать системное свойство проекту Maven

Я хочу получить доступ к собственности из моего теста и моего webapp (работает локально), и я знаю, что могу использовать свойство системы java.

Должен ли я помещать это в ./settings.xml или что-то в этом роде?

Контекст

Я взял проект с открытым исходным кодом и сумел изменить конфигурацию дб использовать JavaDB

Теперь в JDBC URL для JavaDB, расположение базы данных может быть определено как полный путь (см: this other question)

Или свойство системы: derby.system.home

у меня есть код работает уже, но в настоящее время это все жёстко к:

jdbc:derby:/Users/oscarreyes/javadbs/mydb 

И я хочу, чтобы удалить полный путь, чтобы оставить это нравится:

jdbc:derby:mydb 

Для этого мне нужно задать свойство системы (derby.system.home) для Maven, но я не Не знаю как.

Тест выполняется с использованием junit (я не вижу никакого плагина в pom.xml), а веб-приложение работает с плагином причала.

Указания системного свойства в командной строке, кажется, работает на пирс, но я не уверен, что это что-то практическое (предоставляются некоторые другие пользователи могут запускать его из затмения/идея/все)

+0

У меня был точно такой же проблема, когда я переместил свои тесты для интеграции тестов (переименовал их и добавил Maven-безотказный-плагин. Это свойство системы перестало работать. Я также должен был двигаться systemPropertyVariables из Maven-surefire- плагин в этом maven-отказоустойчивом плагине. Системное свойство, настроенное в maven-surefire-plugin, было проигнорировано с помощью тестов интеграции. – Alexandr

ответ

51

Есть ли способ (я имею в виду, как я) установить системное свойство в проекте maven? Я хочу, чтобы получить доступ к свойству из моего теста [...]

Вы можете установить системные свойства в конфигурации Maven Surefire Plugin (это имеет смысл, так как тесты раздвоенные по умолчанию). От Using System Properties:

<project> 
    [...] 
    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
      <systemPropertyVariables> 
      <propertyName>propertyValue</propertyName> 
      <buildDirectory>${project.build.directory}</buildDirectory> 
      [...] 
      </systemPropertyVariables> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 
    [...] 
</project> 

и мой веб-приложение (работает локально)

Не уверен, что вы имеете в виду здесь, но я предполагаю, что контейнер WebApp запускается Maven.Вы можете передать свойства системы в командной строке с помощью:

mvn -DargLine="-DpropertyName=propertyValue" 

Update: Хорошо, есть сейчас. Для Jetty вы также можете установить свойства системы в конфигурации Maven Jetty Plugin. От Setting System Properties:

<project> 
    ... 
    <plugins> 
    ... 
     <plugin> 
     <groupId>org.mortbay.jetty</groupId> 
     <artifactId>maven-jetty-plugin</artifactId> 
     <configuration> 
     ... 
     <systemProperties> 
      <systemProperty> 
       <name>propertyName</name> 
       <value>propertyValue</value> 
      </systemProperty> 
      ... 
     </systemProperties> 
     </configuration> 
     </plugin> 
    </plugins> 
</project> 
+0

Я смог указать это в командной строке, но я действительно не знаю, если это лучший способ. Я обновлю свой первоначальный вопрос. В то же время +1 – OscarRyz

+1

@ Оскар, который я вижу сейчас. Как я уже писал, тесты JUnit работать в разветвленной виртуальной машине, поэтому вам действительно нужно установить системные свойства в sur efire. И Maven Jetty Plugin предоставляет аналогичные средства конфигурации. Я предлагаю настроить оба варианта, это намного лучший вариант, чем командная строка. –

+0

Я думал, что каждый может читать мысли, как я ... (кстати, перестань думать об этом !!!) ... Это сработало отлично. Спасибо !! – OscarRyz

2

Если тест и webapp находятся в одном проекте Maven, вы можете использовать свойство в проекте POM. Затем вы можете отфильтровать определенные файлы, которые позволят Maven установить свойство в этих файлах. Существуют различные способы фильтрации, но наиболее часто встречаются во время фазы ресурсов. http://books.sonatype.com/mvnref-book/reference/resource-filtering-sect-description.html

Если тест и webapp находятся в разных проектах Maven, вы можете поместить это свойство в settings.xml, который находится в папке вашего maven-репозитория (C: \ Documents and Settings \ имя_пользователя.m2) в Windows. Вам все равно придется использовать фильтрацию или какой-либо другой метод, чтобы прочитать свойство в вашем тесте и webapp.

+2

Мне действительно нужно это как свойство System, поэтому я могу выполнить 'System.getProperty (« myproperty »);' – OscarRyz

45

properties-maven-plugin плагин может помочь:

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>properties-maven-plugin</artifactId> 
    <version>1.0.0</version> 
    <executions> 
     <execution> 
      <goals> 
       <goal>set-system-properties</goal> 
      </goals> 
      <configuration> 
       <properties> 
        <property> 
         <name>my.property.name</name> 
         <value>my.property.value</value> 
        </property> 
       </properties> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
+4

Я не понимаю, почему maven-surefire-plugin упоминается для вещей, которые не связаны с тестированием. Похоже, что это совершенно отдельная вещь от нормального развития/развертывания, и я не понимаю конфликтования. – jjpe

7

я узнал, что это также можно сделать с помощью ехес-Maven-плагин, если вы делаете «автономный» Java приложение ,

  <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>${maven.exec.plugin.version}</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>java</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <mainClass>${exec.main-class}</mainClass> 
       <systemProperties> 
        <systemProperty> 
         <key>myproperty</key> 
         <value>myvalue</value> 
        </systemProperty> 
       </systemProperties> 
      </configuration> 
     </plugin> 
Смежные вопросы