Есть ли лучшие практики для работы с Java EE и java.endorsed.dirs? - PullRequest
7 голосов
/ 22 июня 2011

Недавно я столкнулся с проблемой автономной работы Glassfish (v3.1) против встроенного Glassfish (v3.1) против Java Java и способа использования java.endorsed.dirs. Конкретная проблема, с которой я столкнулся, это здесь , но я не думаю, что в последний раз я столкнусь с чем-то похожим.

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

Итак, при развертывании в автономном контейнере Glassfish моё приложение будет работать на одобренных библиотеках, которые включает Glassfish, но при использовании встроенного контейнера это не так. Я столкнулся с моей первоначальной проблемой, потому что плагин maven-embedded-glassfish-plugin не запускает Glassfish, внедренный с использованием одобренных библиотек, как это делает автономный Glassfish. Я также не уверен, включают ли другие контейнеры (например, jboss) тот же набор одобренных библиотек, что и Glassfish.

Итак, я (1) должен изо всех сил (чтобы) убедиться, что мое приложение скомпилировано с одобренными библиотеками и всегда развернуто в контейнере, который загружается с использованием одобренных библиотек, или я должен (2) просто придерживаться используя то, что в комплекте с Java SE 6?

Если я выберу (2), придется ли мне беспокоиться о несовместимости при развертывании моего приложения в контейнере, который загружается с новыми одобренными библиотеками?

Буду признателен за любую информацию, которую может предложить каждый.

Ответы [ 2 ]

4 голосов
/ 15 августа 2012

РЕДАКТИРОВАТЬ : Подход 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.Я надеюсь, что это поможет вам.

2 голосов
/ 26 июня 2011

Я могу упустить что-то очевидное здесь, но ... Разве GlassFish Embbeded не поставляется с библиотеками, совместимыми со спецификациями Java EE? И разве эти библиотеки не загружены по умолчанию? (Если это не так, пожалуйста, заполните ошибку здесь: http://java.net/jira/browse/EMBEDDED_GLASSFISH).

Я имею в виду следующее: вы должны скомпилировать по API спецификации Java EE и просто позволить контейнеру использовать свои собственные реализации.

Для первой части, если вы используете Maven, мне нравится, как Codehaus archetypes устанавливает одобренные библиотеки. Это и чистый, и Agnostic сервера приложений:

<properties>
   <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

...

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <compilerArguments>
            <endorseddirs>${endorsed.dir}</endorseddirs>
        </compilerArguments>
    </configuration>
 </plugin>

...

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.1</version>
    <executions>
       <execution>
            <phase>validate</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <outputDirectory>${endorsed.dir}</outputDirectory>
                <silent>true</silent>
                <artifactItems>
                    <artifactItem>
                        <groupId>javax</groupId>
                        <artifactId>javaee-endorsed-api</artifactId>
                        <version>6.0</version>
                        <type>jar</type>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

Это почти все, что вам нужно для компиляции ваших проектов с использованием API Java EE 6. Любой сервер приложений, совместимый с Java EE 6, должен предоставлять эти услуги, и вам не следует беспокоиться о том, как они делают его доступным для вашего приложения.

Ответственность за загрузку Java EE Services должна лежать на вашем сервере приложений. Если вы попробуете свое собственное решение «в доме», скорее всего, JAR Hell вырвется на свободу.

Приветствия

...