Статьи

Несколько советов и хитростей

Я работал над переносом существующего приложения, которое использовало WebLogic Workshop (да, вы правильно прочитали, используя неподдерживаемую IDE) в maven. Во время путешествия было несколько ошибок, которые я хотел бы отметить здесь для тех, кто может найти это полезным и особенно для себя, просто для справки.

В целом приложение использовало Apache XMLBeans для решения всего, что связано с XML, и это была первая часть, которую я перешел на maven. У Maven действительно был плагин maven для XMLBeans, и следующий фрагмент объясняет, как вы можете включить этот плагин в свой проект;

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<build>
    <plugins>
 
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>xmlbeans-maven-plugin</artifactId>
        <version>2.3.3</version>
  <configuration>
   <javaSource>1.5</javaSource>
   </configuration>
        <executions>
        <execution>
         <phase>generate-sources</phase>
            <goals>
              <goal>xmlbeans</goal>
            </goals>
        </execution>
         
       
        </executions>
      </plugin>
    </plugins>
  </build>

Здесь есть один важный момент: вам нужно использовать тег <javaSource> 1.5 </ javaSource>, если вы хотите, чтобы сгенерированный код XMLBeans имел структуру данных «List» для элементов, для maxoccurs которых установлено неограниченное значение. Это только если ваш код уже использует тип списка. Без этого тега этот плагин будет просто генерировать тип Array для неограниченных элементов.

Затем пришло время мигрировать модули, которые показали веб-сервисы приложения. Поскольку это выполнялось в WebLogic, он использовал задачу «jwsc» для генерации требуемого артефакта. Я не смог найти готовый плагин maven, который удовлетворил это требование, и после некоторого поиска я наткнулся на решение, где сборка муравьев была вызвана через плагин maven ant run. Давайте посмотрим на изменения конфигурации, необходимые для pom.xml;

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<plugin>
      <groupId>org.codehaus.gmaven</groupId>
      <artifactId>gmaven-plugin</artifactId>
      <version>1.3</version>
      <executions>
        <execution>
          <id>set-main-artifact</id>
          <phase>package</phase>
          <goals>
            <goal>execute</goal>
          </goals>
          <configuration>
            <source>
              project.artifact.setFile(new File(project.build.directory+'/'+project.artifactId+'-'+project.version+'.war'))
            </source>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.6</version>
        <executions>
            <execution>
                <phase>prepare-package</phase>
                <configuration>
                    <target>
                        <property name="maven.compile.classpath" refid="maven.compile.classpath" />
                        <property name="maven.runtime.classpath" refid="maven.runtime.classpath" />
                        <property name="maven.test.classpath" refid="maven.test.classpath" />
                        <property name="maven.plugin.classpath" refid="maven.plugin.classpath" />
                        <ant antfile="src/main/ant/build.xml" target="all" />
                    </target>
                </configuration>
                <goals>
                    <goal>run</goal>
                </goals>
            </execution>
        </executions>
        <dependencies>
            <dependency>
                <groupId>org.apache.ant</groupId>
                <artifactId>ant</artifactId>
                <version>1.7.1</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>ant-contrib</groupId>
                <artifactId>ant-contrib</artifactId>
                <version>1.0b2</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
   <groupId>weblogic</groupId>
   <artifactId>weblogic</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
   <dependency>
   <groupId>weblogic</groupId>
   <artifactId>xmlbeans</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
   <dependency>
   <groupId>weblogic</groupId>
   <artifactId>wlserv</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
   <dependency>
   <groupId>weblogic</groupId>
   <artifactId>jaxwsrt</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
   <dependency>
   <groupId>weblogic</groupId>
   <artifactId>beadescriptor</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
  <dependency>
   <groupId>weblogic</groupId>
   <artifactId>beadescriptorbinding</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
  <dependency>
   <groupId>weblogic</groupId>
   <artifactId>beadescriptorsettable</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
  <dependency>
   <groupId>weblogic</groupId>
   <artifactId>staxb</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
   <dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>2.4.0</version>
  </dependency>
  <dependency>
   <groupId>weblogic</groupId>
   <artifactId>webservices</artifactId>
   <version>10.3.0</version>
   <scope>compile</scope>
  </dependency>
            <dependency>
                <groupId>com.sun</groupId>
                <artifactId>tools</artifactId>
                <version>1.5.0</version>
                <scope>system</scope>
                <systemPath>${java.home}/../lib/tools.jar</systemPath>
            </dependency>
        </dependencies>
    </plugin>
     
        <plugin>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.1.1</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
            
            <executions>
                  <execution>
                      <id>default-war</id>
                      <phase>none</phase>
                  </execution>
              </executions>
              
        </plugin>

Обратите внимание, что элементы зависимости с groupId, установленным с «weblogic», были установлены в хранилище maven вручную с помощью команды установочного файла maven. Необходимые библиотеки jar:

  • wlfullclient.jar (этот jar был создан согласно инструкциям, указанным здесь )
  • webserviceclient.jar
  • webservices.jar
  • WLS-api.jar
  • xercesImpl.jar
  • xmlParserAPIs.jar
  • com.bea.core.descriptor.settable.binding_1.4.0.0.jar
  • com.bea.core.descriptor.wl.binding_1.1.0.0.jar
  • com.bea.core.descriptor.wl_1.1.0.0.jar
  • com.bea.core.xml.beaxmlbeans_1.0.0.0_2-4-0.jar
  • com.bea.core.xml.staxb.buildtime_1.3.0.0.jar
  • glassfish.jaxws.rt_2.1.3.jar

Следующим шагом является удаление файла ant build.xml в каталог src / main / ant вашего проекта. Build.xml выглядит следующим образом;

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<project name="build-webservice" default="all">
 
    <target name="all" depends="build.webService" />
 
    <path id="maven_plugin_classpath">
        <pathelement path="${maven.plugin.classpath}" />
    </path>
 
    <path id="maven_runtime_classpath">
        <pathelement path="${maven.compile.classpath}" />
        <pathelement path="${maven.runtime.classpath}" />
        <pathelement path="${maven.plugin.classpath}" />
        <pathelement path="${weblogic.jar}" />
    </path>
 
    <taskdef name="jwsc"
             classname="weblogic.wsee.tools.anttasks.JwscTask"
             classpath="${weblogic.jar}"
             classpathref="maven_plugin_classpath"
    />
 
    <target name="build.webService" description="Compile the web services if not up2date">
        <!--
            Eclipse compiles and places classes into target/classes when the workspace is building.
            If this folder exists when jwsc runs, then any classes that are already compiled will NOT
            be included in the final WAR file.  Thus, this directory is removed prior to created the
            webServices WAR fie.
        -->
        <delete dir="target/classes" />
        <jwsc srcdir="${project.build.sourceDirectory}"
              destDir="target"
              classpathref="maven_runtime_classpath"
              keepGenerated="yes"
              applicationxml="${project.build.directory}/application.xml"
              fork="true"
              memorymaximumsize="256m"
              verbose="true"
              debug="on"
        >
            <module contextPath="ws" name="${project.artifactId}-${project.version}">
                <jwsfileset srcdir=".">
                   <include name="**/*.java" />
                   <exclude name="**/*Test.java" />
                 </jwsfileset>
            </module>
        </jwsc>   
    </target>   
</project>

Обратите внимание, что в этом build.xml не требуется вносить изменения.

Далее речь шла о создании модуля EAR для развертывания в weblogic. Глядя на EAR, созданный WebLogic Workshop, я увидел, что все необходимые сторонние библиотеки были объединены в папку с именем APP-INF / lib, которая находилась в корневом каталоге EAR. Также в файлах WAR не было jar-файлов в каталоге lib, и я хотел имитировать эту функцию при создании EAR с использованием maven. Следующая конфигурация позволила мне сделать это;

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<build>
  <finalName>ErrorXAEAR</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.10.1</version>
        <configuration>
          <defaultLibBundleDir>APP-INF/lib/</defaultLibBundleDir>
          <skinnyWars>true</skinnyWars>
    <modules>
             <jarModule>
              <groupId>mtn.sa.errorxa</groupId>
       <artifactId>errorxa-ejb</artifactId>
               <bundleDir>/</bundleDir>
       <bundleFileName>ErrorXAEJB.jar</bundleFileName>
             </jarModule>
       <webModule>
               <groupId>mtn.sa.errorxa</groupId>
       <artifactId>errorxa-service</artifactId>
               <bundleDir>/</bundleDir>
       <bundleFileName>ErrorXAService.war</bundleFileName>
             </webModule>
          </modules>
        </configuration>
   
      </plugin>
    </plugins>
  </build>

Тег <skinnyWars> — это то, что позволяет каталогу lib файла war не заполняться необходимыми сторонними библиотеками, которые теперь связаны в каталоге APP-INF / lib на EAR. Тег <defaultLibBundleDir> позволяет копировать все необходимые библиотеки в папку с именем APP-INF / lib в EAR.

Еще одна вещь, связанная с генерацией EAR, заключается в том, что я не хотел, чтобы maven генерировал файл application.xml, так как этот файл вместе с weblogic-application.xml уже был создан в проекте, и я хотел использовать его. Чтобы добиться этого, все, что мне нужно было сделать, это поместить оба этих файла в папку src / main / application, и файл application.xml по умолчанию был переопределен.

Я обнаружил, что mvn зависимость: древовидный инструмент maven очень полезен при создании EAR для выявления и удаления ненужных зависимостей, перетаскиваемых в EAR через рекурсивные зависимости. С помощью простого тега исключения я смог удалить ненужные библиотеки.

Вот об этом для этого поста. Я буду продолжать обновлять пост с любыми вещами, которые я могу встретить. Следующим шагом является использование maven для развертывания и развертывания каждого приложения в процессе сборки.

Ссылка: Несколько полезных советов и рекомендаций от нашего партнера JCG, Динуки Арраулератне, в блоге My Journey Through IT .