Статьи

Создание общей библиотеки для Jersey 2.19 для использования с Weblogic 12.1.3

Сервер Weblogic поставляется с общей библиотекой, поэтому вы можете развертывать приложения JAX-RS 2.0; но ограничено версией 2.5.1 Джерси, и инструкции по ее изменению не совсем очевидны или просты . Недавно я присоединился к новой команде в Oracle, и я первым делом посмотрел на обновление зависимых библиотек. Теперь я разговаривал с командой Джерси, и они не поддерживают эту комбинацию; но это может быть достаточно полезно, чтобы избавить вас от обязательств, пока не будет выпущена следующая версия Weblogic.

Я собираюсь сделать это с помощью Maven, потому что это означает, что вся упаковка и загрузка для вас. Основная структура проекта выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
|-pom.xml
|-src
| |-main
| | |-java
| | |-resources
| | | |-META-INF
| | | | |-MANIFEST.MF
| | |-webapp
| | | |-WEB-INF
| | | | |-web.xml
| | | | |-weblogic.xml

Я только что сгенерировал ванильный проект Maven с использованием Netbeans, а затем добавил необходимые мне зависимости Джерси, вероятно, этот файл можно было бы еще немного сократить с некоторой решимостью. Но это работало достаточно хорошо для меня:

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
<?xml version="1.0" encoding="UTF-8"?>
    <modelVersion>4.0.0</modelVersion>
 
     
 
    <groupId>com.example</groupId>
    <artifactId>JerseyLibrary</artifactId>
    <version>2.9</version>
    <packaging>war</packaging>
 
    <name>Jersey Library</name>
 
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
          
        <jersey.version>2.19</jersey.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>${jersey.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-client</artifactId>
            <version>${jersey.version}</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-multipart</artifactId>
            <version>${jersey.version}</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.media</groupId>
            <artifactId>jersey-media-moxy</artifactId>
            <version>${jersey.version}</version>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <archive>
                        <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
                    </archive>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</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>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
 
</project>

Следующий по важности файл в файле MANIFEST.MF сообщает Weblogic, когда вы пытаетесь развернуть .war, что это библиотека, а также содержит версии, которые она предоставляет:

1
2
3
4
5
Specification-Title: Weblogic JAX-RS 2.0
Specification-Version: 2.0
Implementation-Title: Weblogic JAX-RS 2.0 Reference Implementation
Implementation-Version: 2.19
Extension-Name: jax-rs

Наконец, вы должны включить файл weblogic.xml, чтобы сообщить серверу, что некоторые классы вам нужно брать отсюда, а не загрузчик классов сервера. Я получил это из файла, который поставляется с библиотекой общего доступа 2.5.1, которая поставляется с 12.1.3, а затем добавил еще несколько строк, чтобы учесть, как движется код. В зависимости от того, что делает ваш код, вам может потребоваться добавить еще несколько.

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
<?xml version="1.0" encoding="UTF-8"?>
<weblogic-web-app
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
  <container-descriptor>
        <prefer-application-packages>
            <!-- apis -->
            <package-name>javax.ws.rs.*</package-name>
 
            <!-- guava -->
            <package-name>com.google.common.*</package-name>
 
            <!-- jersey providers -->
            <package-name>com.sun.jersey.*</package-name>
            <package-name>org.glassfish.jersey.*</package-name>
             
            <package-name>jersey.repackaged.*</package-name>
             
            <!-- hk2 -->
            <package-name>org.jvnet.hk2.*</package-name>
            <package-name>org.jvnet.hk2.tiger_types.*</package-name>
            <package-name>org.glassfish.hk2.*</package-name>
 
            <package-name>javassist.*</package-name>
 
            <!-- media providers -->
            <package-name>org.eclipse.persistence.jaxb.rs.*</package-name>
            <package-name>org.codehaus.jackson.jaxrs.*</package-name>
 
            <!-- wls -->
            <package-name>weblogic.jaxrs.api.client.*</package-name>
            <package-name>weblogic.jaxrs.internal.api.client.*</package-name>
            <package-name>weblogic.jaxrs.dispatch.*</package-name>
            <package-name>weblogic.jaxrs.monitoring.util.*</package-name>
        </prefer-application-packages>
    </container-descriptor>
</weblogic-web-app>

Теперь все, что для этого нужно — это быстрая mvn install и в целевом каталоге будет хорошая полноценная общая библиотека JerseyLibrary-2.9.war, которую вы можете развернуть обычным способом. Не забудьте, конечно, обновить записи библиотеки для .war, который будет зависеть от этого, чтобы иметь правильные версии в нем, чтобы он брал версию 2.5.1.