РЕДАКТИРОВАТЬ : Подход javaee-endorsed-api
, описанный выше, вероятно, будет работать нормально, но он дает мне волю.Я не думаю, что это произведено или поддержано больше.Кроме того, pom.xml
, который он содержит внутри, отражает, что в какой-то момент он назывался javaee-compact-api
, и вы можете видеть, как они исключают классы реализации из него.В отличие от этого, выбор вишен для API, который вы хотите использовать в качестве одобренного (как я рекомендую ниже), кажется более стабильным и гибким.Наконец, если вы все еще хотите использовать подход javaee-endorsed-api
, вы все равно можете использовать общий подход, который я рекомендую, и указать вместо него javaee-endorsed-api.jar
.
Ryan;Я только что пролистал ваш длинный след по этому (касаясь StackOverflow, форумов java.net и т. Д.) В том же путешествии.
Во время модульного или интеграционного тестирования вам необходимо установить системное свойство java.endorsed.dirs
, как вы знаете.
Хитрость в том, что вы должны сделать это таким образом, чтобы JVM, выполняющая тесты, подхватила его.И это зависит от того, как у вас работает Surefire.
Если по какой-то причине у вас установлен Surefire на , а не fork, это, вероятно, плохо, и вам следует пересмотреть свою конфигурацию здесь.
Если вы настроили Surefire на форк, вы можете подумать, что можете просто включить java.endorsed.dirs
в строфу systemPropertyVariables
, например:
<systemPropertyVariables>
<java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs>
</systemPropertyVariables>
... но этобыло бы неправильно.Причина в том, что фактически запущенная программа называется ForkedBooter
, а ForkedBooter
программно устанавливает системные свойства для ваших модульных тестов.То есть к тому моменту, когда ваша <systemPropertyVariables>
строфа прочитана ForkedBooter
, уже слишком поздно.
Но вы можете использовать <argLine>
в своемКонфигурация Surefire выглядит следующим образом:
<configuration>
<argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine>
</configuration>
Теперь для виртуальной машины, на которой разрабатываются Surefire, будут установлены соответствующие каталоги одобренного каталога.Теперь давайте поговорим о том, какое значение предоставить.
Вы хотите выбрать API для переопределения.В вашем случае javax.annotation.*
является законным выбором.Вы хотите указать каталог в своем локальном репозитории Maven, в котором находится соответствующий файл.
Вот значение, которое я использую:
${settings.localRepository}${file.separator}org${file.separator}glassfish${file.separator}main${file.separator}javaee-api${file-separator}javax.annotation${file.separator}${javaxAnnotationVersion}
- Maven гарантирует, что
${settings.localRepository}
будетразверните значение, в котором находится ваш локальный репозиторий Maven. ${file.separator}
- это способ получения значения System.getProperty("file.separator")
при замене свойства Maven. - В моем случае, я 'мы уже объявили
<dependency>
для артефакта GlassFish, который объединяет пакет javax.annotation
, как определено в Java EE 6 .Итак, здесь я построил путь к артефакту.Я также определил свойство с именем javaxAnnotationVersion
, которое для меня установлено на 3.1.2
.
Как только вы все это сделаете, тогда, когда Surefire разбудит виртуальную машину для запуска вашего устройстваВ ходе тестов для утвержденных каталогов будет установлен каталог в вашем локальном репозитории Maven, содержащий jar, в котором хранятся классы javax.annotation
, а теперь встроенный GlassFish, который выполняется в процессе, будет использовать версии классов javax.annotation
Java EE 6.вместо версий Java SE 6.Я надеюсь, что это поможет вам.