<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<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/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <parent>
      <groupId>org.apache.activemq</groupId>
      <artifactId>artemis-pom</artifactId>
      <version>2.19.2-SNAPSHOT</version>
   </parent>

   <artifactId>artemis-jms-client-all</artifactId>
   <packaging>jar</packaging>
   <name>ActiveMQ Artemis JMS Client All</name>

   <properties>
      <activemq.basedir>${project.basedir}/..</activemq.basedir>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>artemis-jms-client</artifactId>
         <version>${project.version}</version>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
       <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.2.3</version>
            <executions>
               <execution>
                  <phase>package</phase>
                  <goals>
                     <goal>shade</goal>
                  </goals>
                  <configuration>
                     <createSourcesJar>true</createSourcesJar>
                     <shadeSourcesContent>true</shadeSourcesContent>
                     <filters>
                        <filter>
                           <artifact>*:*</artifact>
                           <excludes>
                              <exclude>INSTALL.html</exclude>
                              <exclude>LICENSE</exclude>
                              <exclude>README</exclude>
                              <exclude>META-INF/*.SF</exclude>
                              <exclude>META-INF/*.DSA</exclude>
                              <exclude>META-INF/*.RSA</exclude>
                              <exclude>META-INF/ASL2.0</exclude>
                              <exclude>META-INF/DEPENDENCIES.txt</exclude>
                              <exclude>META-INF/LICENSE.txt</exclude>
                              <exclude>META-INF/NOTICE.txt</exclude>
                              <exlude>overview.html</exlude>
                           </excludes>
                        </filter>
                        <filter>
                           <artifact>org.jgroups:jgroups</artifact>
                           <includes>
                              <include>org/jgroups/**</include>
                              <include>jg-magic-map.xml</include>
                              <include>jg-protocol-ids.xml</include>
                              <include>*.properties</include>
                              <include>*.xsd</include>
                           </includes>
                        </filter>
                     </filters>
                     <transformers>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                           <resource>META-INF/DEPENDENCIES</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ApacheNoticeResourceTransformer">
                           <addHeader>false</addHeader>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.DontIncludeResourceTransformer">
                           <resource>.txt</resource>
                           <resource>features.xml</resource>
                        </transformer>
                        <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
                     </transformers>
                     <relocations>
                        <relocation>
                           <pattern>org.apache.activemq</pattern>
                           <shadedPattern>org.apache.activemq</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>org.apache.geronimo</pattern>
                           <shadedPattern>org.apache.activemq.artemis.shaded.org.apache.geronimo</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>com.google</pattern>
                           <shadedPattern>org.apache.activemq.artemis.shaded.com.google</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>org.apache.johnzon</pattern>
                           <shadedPattern>org.apache.activemq.artemis.shaded.org.apache.johnzon</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>org.apache.commons</pattern>
                           <shadedPattern>org.apache.activemq.artemis.shaded.org.apache.commons</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>org.jboss</pattern>
                           <shadedPattern>org.apache.activemq.artemis.shaded.org.jboss</shadedPattern>
                        </relocation>
                        <relocation>
                           <pattern>org.jgroups</pattern>
                           <shadedPattern>org.apache.activemq.artemis.shaded.org.jgroups</shadedPattern>
                        </relocation>
                     </relocations>
                  </configuration>
               </execution>
            </executions>
         </plugin>
      </plugins>
   </build>
</project>
