Как загрузить собственные библиотеки в Tomcat с несколькими веб-приложениями на Java? - PullRequest
0 голосов
/ 09 апреля 2019

В настоящее время я работаю над простым приложением JAX-RS (Джерси), которое подключается к частной базе данных. Из-за того, что это частная собственность, я вынужден запускать свое приложение в ограниченной среде. Мне также нужно включить jar и несколько файлов .so от производителя базы данных, поэтому у меня есть доступ к определенным методам доступа к базе данных. И вот где я не могу найти свое исключение UnsatisfiedLinkError: Мое приложение должно запускаться внутри контейнера Apache Tomcat от производителя с приложениями внутри, в которые уже загружены все собственные библиотеки, которые мне нужны.

Видимо, я не могу изменить уже запущенные приложения.

Я вынужден использовать версию Java JDK 1.8 и Apache Tomcat 8.5.33.

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

Я провел некоторое исследование и получил ответ пользователя Stackoverflow Бретт Кейл , который описывает 3 решения моей проблемы: Ошибка UnsatisfiedLink: opencv_java2411.dll уже загружен в другой загрузчик классов в стеклянной рыбе

  1. Загрузка собственной библиотеки из загрузчика классов на уровне сервера, который может использоваться всеми приложениями на сервере и не будет воссоздан при перезапуске приложения. Большинство серверов приложений поддерживают это, но конфигурация зависит от продукта.

  2. Если только собственная программа обращается к собственной библиотеке, но она перезапускается, вместо этого перезапустите всю JVM сервера приложений.

  3. Если несколько приложений обращаются к собственной библиотеке, скопируйте собственную библиотеку в разные места, чтобы заставить JVM дважды загрузить ее.

Первоначально я хотел связаться с этим пользователем и попросить его разработать номер 3, так как это кажется моим единственным жизнеспособным вариантом в моем сценарии. Мне пришлось начинать новый вопрос, потому что я, как новый пользователь, понял, что у меня недостаточно очков Stackoverflow, чтобы прокомментировать его ответ, и вообще общение с пользователем напрямую является нежелательной функцией на этом сайте.

Так может ли кто-нибудь привести мне пример того, как должен выглядеть номер 3? Я сам попробовал, отредактировав setensh.sh/bat, но это не сработало.

Если вам понадобится какой-нибудь код из моего приложения (которое построено с помощью maven), я добавлю его, если потребуется. Я думаю, что код из моего приложения не помог бы прямо сейчас, а просто добавил бы отвлечение от моей настоящей проблемы. Но так как я собрал и упаковал приложение с помощью maven, кажется, что для ясности необходимо добавить мой pom.xml.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test</groupId>
    <artifactId>demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>rest Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>2.28</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.28</version>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.inject</groupId>
            <artifactId>jersey-hk2</artifactId>
            <version>2.28</version>
        </dependency>
        <dependency>
            <groupId>com.canto</groupId>
            <artifactId>cumulus</artifactId>
            <version>11.1.3.1</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
        <finalName>demo</finalName>
    </build>
</project>

Также необходим файл setenv (стандарт производителя):

DYLD_LIBRARY_PATH="/usr/local/Cumulus_WebSolutions/lib"
export DYLD_LIBRARY_PATH
JAVA_HOME=
export JAVA_HOME
JRE_HOME="/usr/local/Cumulus_WebSolutions/jre"
export JRE_HOME
#JAVA_OPTS=-d32
JAVA_OPTS=-Djava.system.class.loader=com.canto.cumulus.utils.ModuleClassLoader
export JAVA_OPTS
CLASSPATH="/usr/local/Cumulus_WebSolutions/CumulusJC.jar"
export CLASSPATH

В общем, когда я компилирую и упаковываю код с помощью maven, я сначала получаю следующую ошибку: org.glassfish.jersey.server.ContainerException: java.lang.UnsatisfiedLinkError: Native Library /usr/local/Cumulus_WebSolutions/lib/libCumulusJC.jnilib.11.1.3 already loaded in another classloader После перезагрузки моего приложения появится эта ошибка: org.glassfish.jersey.server.ContainerException: java.lang.UnsatisfiedLinkError: com.canto.cumulus.Server.openConnection1(Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/canto/cumulus/Server;

Итак, чтобы закончить, кто-нибудь знает, как я могу получить доступ к собственной библиотеке с помощью Java-приложения, в то время как к ним уже обращаются другие развернутые приложения на сервере Tomcat, без необходимости настраивать другие уже существующие приложения?

...