2017-02-16 7 views
1

Я хочу создать две версии приложения, единственное различие заключается в том, что я хочу обменять в другой версии одного файла .java. У меня уже есть сборка Maven для создания источника, а также сборка Ant, которая затем упаковывается как zip со встроенной JRE.С Maven, как мне построить две версии Java-проекта только с одним другим .java-файлом?

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

Обновленный С Прогресс

Я теперь подклассы стартовый класс с методом main(), поэтому больше не нужно менять исходные файлы вокруг вместо этого просто нужно передать значение разности для mainClass в манифесте, и теперь мы есть только одно исходное дерево для сборки.

Так что в моем pom.xml у меня есть:

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.3</version> 
     <configuration> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
      <descriptors> 
       <descriptor>assembly.xml</descriptor> 
      </descriptors> 
      <archive> 
       <manifest> 
            <mainClass>com.companyname.StartClass</mainClass> 
        <packageName>com.companyname</packageName> 
        <addClasspath>true</addClasspath> 
       </manifest> 
      </archive> 
     </configuration> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 

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

+0

Как вы изменяете этот исходный файл между сборками? Возможно ли достичь другого поведения во время выполнения, обратившись к файлу конфигурации ресурса? BTW, вам не нужно использовать отдельную сборку Ant. [Maven Assembly Plugin] (https://maven.apache.org/plugins/maven-assembly-plugin/) можно настроить в POM вашего проекта, чтобы сделать именно это. –

+0

@GeroldBrosser 'Как изменить исходный файл между сборками? «вот в чем суть дела, и для меня лучшее решение, чем использование файла конфигурации для достижения разницы. –

+0

На самом деле я имел в виду, как вы поочередно меняете содержимое исходного файла. Вы переписываете его из двух разных мест каждый раз? Вы меняете его вручную? –

ответ

0

В основном это против нескольких основных понятий в Maven:

  • Один проект имеет один <build>/<sourceDirectory>, что приводит к одному артефакту.
  • Артефакт с таким же именем (<finalName>, полученный от <artifactId> и <version> по умолчанию) должен иметь одинаковый контент.

Есть несколько решений:

  • property из файла свойств, которое вычисляется в if для достижения различного поведения во время выполнения. Тебе это не нравится.
  • A property определяется через командную строку, которая оценивается в if.
  • A text from a resource file, который оценивается в if. Тебе это не нравится.
  • A command line argument, который оценивается в if.
  • A Java assertion, но процитировано оттуда: «Не используйте утверждения для выполнения какой-либо работы, необходимой вашему приложению для правильной работы.».

Один Maven путь будет:

  • Создание двух дополнительных проектов (B, C) в дополнение к текущей (A). A может быть parent of B and C to inherit common declarations.
  • B и C содержат только разные исходные файлы.
  • Введем два profiles в POM с <dependencies> и выбрать один из различных способов активации:

 

<profiles> 

    <profile> 
     <id>B</id> 
     <activation> 
     ... 
     </activation> 
     <dependencies> 
     <dependency> 
      <groupId>com.example</groupId> 
      <artifactId>B</artifactId> 
      <version>...</version>    
     </dependency> 
     </dependencies> 
     <build> 
     <finalName>AwithB</finalName> 
     </build> 
    </profile> 

    <profile> 
     <id>C</id> 
     <activation> 
     ... 
     </activation> 
     <dependencies> 
     <dependency> 
      <groupId>com.example</groupId> 
      <artifactId>C</artifactId> 
      <version>...</version>    
     </dependency> 
     </dependencies> 
     <build> 
     <finalName>AwithC</finalName> 
     </build> 
    </profile> 

    </profiles> 

Запомнить вторую концепцию в начале: то же имя, такое же содержание (и поведение). Вы можете использовать объявление <finalName> в профилях, чтобы соответствующим образом адаптировать имя A.

+0

Спасибо, что я обновил свой вопрос, не знаю, как он вписывается в ваш ответ. –

+1

Ваш ответ не разрешил мою проблему, но звучит так, как будто это по сути правильно, поэтому Ive отметил это как это. –

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

  • Нет связанных вопросов^_^