Объединение различных классов Java в одном файле JAR в одном банке - PullRequest
5 голосов
/ 27 января 2010

В основном у меня есть сервер приложений, на котором работает портал LifeRay. и у нас также есть пользовательские портлеты, которые имеют общие пользовательские библиотеки, а также сторонние библиотеки. например, dwr-3.0, несколько jar-файлов drools, spring-webmvc, spring и т. д.

проблема в том, что это кошмар для администрирования сервера, потому что при развертывании кто-то всегда забывает, какая версия была на сервере и т. Д.

Мы используем maven 2, и я подумал о том, чтобы сделать что-то вроде проекта maven, который извлекает зависимости (используя dependencyManagement) из родительского pom, а целью по умолчанию является что-то вроде «разархивировать все зависимости и собрать их в уникальная банка ". таким образом у нас будет уникальный jar со стандартной версией, который будет развернут вместе с остальными файлами вместо необходимости развертывания.

Ребята, вы знаете, как я могу это сделать, если это вообще возможно? Я играл с maven-assembly-plugin без особого успеха. Если сборка - путь, у вас есть пример, чтобы дать мне кикстарт?

Заранее спасибо

Ответы [ 5 ]

2 голосов
/ 27 января 2010

Другой альтернативой является maven-shade-plugin или даже jarjar . Я использовал оба вместе с переименованием пакетов без проблем.

1 голос
/ 27 января 2010

Мне, наконец, удалось разрешить это следующим образом, я не тестировал на сервере приложений, но полученный архив представляет собой файл JAR с содержимым всех желаемых зависимостей. Спасибо Винсенту за подсказку :)

<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>
<groupId>com.test.jarbundle</groupId>
<artifactId>bundle</artifactId>
<version>1.0</version>
<name>bundle</name>
<packaging>jar</packaging>
<url>http://maven.apache.org</url>
<dependencies>
    <dependency>
        <groupId>org.directwebremoting</groupId>
        <artifactId>dwr</artifactId>
        <version>3.0.M1</version>
        <scope>runtime</scope>
        <exclusions>
         <exclusion>
          <artifactId>cometd</artifactId>
          <groupId>org.mortbay.jetty</groupId>
         </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>2.5</version>
        <scope>runtime</scope>
        <exclusions>
         <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
         </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>2.5</version>
        <scope>runtime</scope>
        <exclusions>
         <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
         </exclusion>
         <exclusion>
          <artifactId>aopalliance</artifactId>
          <groupId>aopalliance</groupId>
         </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc-portlet</artifactId>
        <version>2.5</version>
        <scope>runtime</scope>
        <exclusions>
         <exclusion>
          <artifactId>commons-logging</artifactId>
          <groupId>commons-logging</groupId>
         </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-core</artifactId>
        <version>4.0.3</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-compiler</artifactId>
        <version>4.0.3</version>
        <scope>runtime</scope>
        <exclusions>
         <exclusion>
          <artifactId>antlr-runtime</artifactId>
          <groupId>org.antlr</groupId>
         </exclusion>
         <exclusion>
          <artifactId>core</artifactId>
          <groupId>org.eclipse.jdt</groupId>
         </exclusion>
         <exclusion>
          <artifactId>janino</artifactId>
          <groupId>janino</groupId>
         </exclusion>
         <exclusion>
          <artifactId>xercesImpl</artifactId>
          <groupId>xerces</groupId>
         </exclusion>
         <exclusion>
          <artifactId>xml-apis</artifactId>
          <groupId>xml-apis</groupId>
         </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-jsr94</artifactId>
        <version>4.0.3</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-decisiontables</artifactId>
        <version>4.0.3</version>
        <scope>runtime</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>jar.App</mainClass>
                    </manifest>
                </archive>
            </configuration> 
        </plugin>
        <plugin>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>unpack-dependencies</id>
                    <phase>validate</phase>
                    <goals>
                        <goal>unpack-dependencies</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
    <resources>
        <resource>
            <directory>${basedir}/target/dependency</directory>
        </resource>
    </resources>
</build>

И тогда вы запускаете

mvn package

текст ссылки

1 голос
/ 27 января 2010

Я думаю, что то, что вы описали, возможно. Сначала создайте родительский POM, в котором вы объявляете зависимости в элементе <dependencyManagement>:

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>groupIdA<groupId>
  <artifactId>parent</artifactId>
  <packaging>pom<packaging>
  <version>1-SNAPSHOT</version>
  ...
  <dependencyManagement>
    <!-- Standard dependencies used in several build modules. Ensures all modules
         use the same version for these dependencies -->
    <dependencies>
      <dependency>
        <groupId>org.directwebremoting</groupId>
        <artifactId>dwr</artifactId>
        <version>3.0.M1</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.0.0.RELEASE</version>
      </dependency>
      ...
    </dependencies>
  <dependencyManagement>
  ...
</project>

Затем в дочернем проекте объявите необходимые зависимости, не объявляя их версию:

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <artifactId>parent</artifactId>
    <groupId>groupIdA</groupId>
    <version>1-SNAPSHOT</version>
  </parent>
  <artifactId>childB</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>
  <dependencies>
    <dependency>
      <groupId>org.directwebremoting</groupId>
      <artifactId>dwr</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
    </dependency>
      ...
  </dependencies>
  ...
</project>

Наконец, используйте предопределенный дескриптор сборки по умолчанию jar-with-dependencies, чтобы создать общую сборку двоичного пакета со всеми включенными библиотеками зависимостей, распакованными внутри архива .

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.2-beta-5</version>
        <configuration>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id> <!-- this is used for inheritance merges -->
            <phase>package</phase> <!-- append to the packaging phase. -->
            <goals>
              <goal>single</goal> <!-- goals == mojos -->
            </goals>
          </execution>
        </executions>
      </plugin>
      [...]
    </plugins>
  </build>
</project>

Чтобы создать сборку проекта, запустите пакет phase:

mvn package

И это даст следующую сборку в целевой директории:

target/child-1.0-SNAPSHOT-jar-with-dependencies.jar

Я просто не уверен, что вы хотите сделать с этой сборкой (используйте ее как зависимость в проектах портлетов по сравнению с зависимостями pull из родительского POM? Упростите только развертывание liferay?). Все варианты возможны, хотя.

Подробнее см. В документации по для подключаемого модуля *1026* Maven.

1 голос
/ 27 января 2010

Звучит так, как будто Плагин зависимостей - это то, что вам нужно.

Я думаю, что вы можете распаковать все банки зависимостей в указанное место, а затем упаковать их в новый.

Надеюсь, у вас все получится.

0 голосов
/ 09 февраля 2010

И, наконец, лучшим решением было использование maven-shade-plugin:

(snip)
    <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <finalName>${artifactId}-${version}-tmp</finalName>
            </configuration>
        </plugin>
        <plugin>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.3.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <shadedArtifactAttached>true</shadedArtifactAttached>
                        <shadedClassifierName>full</shadedClassifierName>
                        <artifactSet>
                            <excludes>
                                <exclude>classworlds:classworlds</exclude>
                                <exclude>junit:junit</exclude>
                                <exclude>jmock:*</exclude>
                                <exclude>org.apache.maven:lib:tests</exclude>
                                <exclude>log4j:log4j:jar:</exclude>
                            </excludes>
                        </artifactSet>
                        <filters>
                            <filter>
                                <artifact>*:*</artifact>
                                <excludes>
                                    <exclude>META-INF/*.SF</exclude>
                                    <exclude>META-INF/*.DSA</exclude>
                                    <exclude>META-INF/*.RSA</exclude>
                                </excludes>
                            </filter>
                        </filters>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

(надрез)

Что удивительного в плагине Shade, так это в том, что он предупреждает вас, когда вы включаете перекрывающиеся классы (например, весенняя банка (полная) с классами aopalliance)

...