Заменить исходный файл при компиляции maven

#maven-2

#maven-2

Вопрос:

Я должен заменить исходный файл Java во время maven compile , если активен специальный профиль. Я думал о том, чтобы просто исключить файл из стандарта src/main/java/ и включить его из другого исходного каталога, такого как src/main/java2/ .

Но поскольку файлы должны иметь одинаковое имя и пакет, исключение всегда выигрывает, и файл из другого каталога никогда не включается…

Есть какой-нибудь известный рабочий способ сделать это?

Ответ №1:

Я бы использовал плагин Maven Antrun, чтобы переименовать «оригинальный» исходный файл и скопировать «специальный» исходный файл из src/main/java2 в src/main/java перед compile этапом. После compile восстановите исходный файл. Что-то вроде этого (разместите это в профиле):

 <plugin>
  <artifactId>maven-antrun-plugin</artifactId>
  <version>1.4</version>
  <executions>
    <execution>
      <id>replace-source-file</id>
      <phase>process-sources</phase>
      <configuration>
        <tasks>
          <move file="src/main/java/com/stackoverflow/App.java" tofile="src/main/java/com/stackoverflow/App.java.moved"/>
          <copy file="src/main/java2/com/stackoverflow/App.java" todir="src/main/java/com/stackoverflow/"/>
        </tasks>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
    <execution>
      <id>restore-source-file</id>
      <phase>compile</phase>
      <configuration>
        <tasks>
          <move file="src/main/java/com/stackoverflow/App.java.moved" tofile="src/main/java/com/stackoverflow/App.java"/>
        </tasks>
      </configuration>
      <goals>
        <goal>run</goal>
      </goals>
    </execution>
  </executions>
</plugin>
  

Обновление: Как упоминалось OP в комментарии, у этого подхода есть серьезный недостаток. При ошибке компиляции неправильный исходный файл (и *.java.moved файл) остается в src/main/java каталоге. Это проблема.

Более чистой альтернативой было бы переместить обе версии исходного кода в выделенные модули и объявить один или другой модуль как зависимый в зависимости от профиля (обычный артефакт будет включен в активный профиль по умолчанию). Я бы даже не стал связываться с исключениями компилятора. Это сработало бы и было бы чистым.

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

1. Спасибо, это работает, но имеет серьезный недостаток: при ошибке компиляции неправильный исходный файл (и файл *.java.moved) остается в каталоге src / main / java.

2. @user385480 Аргххх, действительно, не подумал об этом. Я обновлю свой ответ.

Ответ №2:

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

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

1. Я сам уже думал о чем-то подобном, но это нарушило бы природу проекта eclipse…

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

Ответ №3:

Используйте для этого опцию Maven filter. Найдите применение по следующей ссылке Maven Filter

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

1. Извините, но чтение документа (ваша ссылка) Я не вижу, как фильтрация могла бы мне здесь помочь…