2017-12-11 123 views
8

Nie sądziłem, że skończę tutaj, ale po wielu wyszukiwaniach Google i StackOverflow tutaj jestem.Jboss EAP 7 - Jak wykluczyć niejawne moduły z wdrożenia (javax.jms)?

This is my exact problem z tym, że nie mogę sobie pozwolić na zmiany kodu.

Wariant, który próbuję wdrożyć, zawiera bibliotekę JMS (tj. javax.jms, której nie można wykluczyć z WAR), która jest już ładowana domyślnie przez Jboss EAP 7. Ścieżka do jar jest podobna do tej jboss/modules/system/layers/base/javax/jms/api/ain/jboss-jms-api_2.0_spec-1.0.0.Final-redhat-1.jar. Z powodu tej dwóch różnych wersji tych samych klas ładowanie otrzymuję ClassCastException.

org.apache.activemq-ra.ActiveMQConnectionFactory cannot to be cast to javax.jms.ConnectionFactory 

Tak, chcę JBoss do NIE obciążenia javax.jms tak, że moja aplikacja może korzystać z JAR dołączone do wojny.

Tak, zastanawiałem się, czy istnieje sposób, aby wykluczyć moduł globalnie (dla wszystkich wdrożeń WAR).

Wyłączenie go na wdrożenie również by działało. I zdaję sobie sprawę, że można go używać pod kontrolą jboss-deployment-structure.xml, ale nie mogę go uruchomić.

Oto, co starałem:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure 
     xmlns="urn:jboss:deployment-structure:1.2"> 
    <deployment> 
     <exclude-subsystems> 
      <subsystem name="javax" /> 
      <subsystem name="javax.jms" /> 
     </exclude-subsystems> 
    </deployment> 
</jboss-deployment-structure> 

i

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure 
    xmlns="urn:jboss:deployment-structure:1.2"> 
    <deployment> 
     <exclusions> 
      <module name="javax" /> 
      <module name="javax.jms" /> 
      <module name="javax.jms.api" /> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

umieściłem plik w WEB-INF katalogu. To nie zadziałało. Wciąż ładował klasę JMS z folderumodułów JBoss EAP. Jak to zrobić poprawnie?

+0

Nie jestem pewien, czy to zadziała, ale nazwą podsystemu powinien być "messaging-activemq", np. '' w wykluczeniu. Jednak nie jestem pewien, czy JMS będzie działał prawidłowo w twoim wdrożeniu, chyba że uwzględnisz również implementację. –

Odpowiedz

2

Należy usunąć plik JAR interfejsu API JMS z wdrożenia. Nadal możesz zachować plik JAR implementacji JMS w swoim wdrożeniu, ale prawdopodobnie powinien to być plik RAR, najlepiej poza wdrożeniem.

+0

Nie rozumiem. –

+0

Której części nie rozumiesz? –

+0

Nie mogę usunąć interfejsu API JMS z mojego WAR (wdrożenie). Przejdź do zaktualizowanego pytania. –

1

Ten numer link ma kilka rzeczy, które możesz wypróbować.

szczególności:

I think the problem is that activemq-all-5.4.2.jar contains javax.jms.*. Your deployment already gets this implicitly from the javaee.api module (see more information about implicity module dependencies here). I don't think it is appropriate for an application module/jar to package Java EE interfaces. You can try simply deleting the javax directory from activemq-all-5.4.2.jar or using a different set of ActiveMQ jars in your module to limit it to only what you need.

i/lub zmieniając swoje module.xml dla ActiveMQ

<module xmlns="urn:jboss:module:1.0" name="activemq"> 
    <resources> 
     <resource-root path="activemq-all-5.4.2.jar"/> 
    </resources> 
    <dependencies> 
     <module name="javax.api"/> 
    </dependencies> 
</module> 

Wydaje się, że metoda embed ActiveMQ in Jboss jak również, jeśli jesteś zainteresowany. Nie będę wyciągał informacji z tego artykułu, ponieważ nie odpowiada na oryginalne pytanie.

1

Prawidłowe jboss-deployment-structure.xml jest tutaj:

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2"> 
    <deployment> 
     <exclude-subsystems> 
      <subsystem name="messaging-activemq"></subsystem> 
     </exclude-subsystems> 
     <exclusions> 
      <module name="javax.jms.api"></module> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

ten sposób można wykluczyć zarówno podsystem wiadomości i API JMS.