Soru Maven-assembly-plugin ile 'sağlanan' kapsam ile bağımlılık nasıl dahil edilir


Maven ile maven-assembly-plugin kullanarak tar dosyaya 'sağlanan' kapsamı ile yönetilen bağımlılık eklemek için mücadele ediyorum.

Tüm projelerim için süper üst düzey bir dosya tabanı olarak kullanıyorum. Projelerin çoğu uygulama sunucusu altında dağıtılacak, böylece süper ortak pompanın altında iki ortak bağımlılık beyan edildi. aşağıda süper ebeveynin ilgili yönetim bölümüdür:

http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xxx.integration</groupId>
    <artifactId>super-parent</artifactId>
    <packaging>pom</packaging>
    <version>1.1.3</version>
    <name>super parent</name>
    <url>http://maven.apache.org.check</url>
.
.
.
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

log4j.version = 2.0.8

Devralınan projeden birinde (bağımsız bir uygulama), bağımlı kitaplıkları bir tar dosyasına dahil etmek için bağımlılık kümeleriyle maven-assembly-plugin kullanıyorum. ve tabii ki log4j kütüphanesini de dahil etmek istiyorum.

aşağıda süper ebeveyninden devralınan pom var:

<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">
    <parent>
        <groupId>com.xxx.integration</groupId>
        <artifactId>super-parent</artifactId>
        <version>1.1.3</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>plugin-cc-checker</artifactId>
    <name>plugin-cc-checker</name>
    <version>2.1</version>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <dependencies>
                    <dependency>
                        <groupId>com.orca.integration</groupId>
                        <artifactId>integration-assembly-descriptor</artifactId>
                        <version>1.1.1</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>make-assembly-according-to-distribution-xml</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                        <configuration>
                            <finalName>${artifactId}</finalName>
                            <!-- This is where we use our shared assembly descriptor -->
                            <descriptors>
                                <descriptor>distribution-app.xml</descriptor>
                            </descriptors>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xerces</artifactId>
            <version>${xerces.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging-api</artifactId>
            <version>${commons-logging-api.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>excalibur</groupId>
            <artifactId>excalibur-i18n</artifactId>
            <version>${excalibur-i18n.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.snmp4j</groupId>
            <artifactId>snmp4j</artifactId>
            <version>${snmp4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>
</project>

dağıtım-app.xml dosyası:

<?xml version="1.0" encoding="UTF-8"?>
<assembly>
    <!-- Add module dependencies and the jar that is created in the packaging 
        phase. Product name will be <project name>-app-<version no>.tar -->
    <id>app-${version}</id>
    <formats>
        <format>tar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>resources/app</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
            <excludes>
                <!-- Since there is a bug in xalan 2.7.1 all applications required to 
                    use xalan-orca jar file -->
                <exclude>xalan:xalan</exclude>
            </excludes>
            <!-- includes> <include>*</include> </includes-->
        </dependencySet>
    </dependencySets>
    <moduleSets>
        <moduleSet>
            <binaries>
                <outputDirectory>/guy</outputDirectory>
                <includes>
                    <include>log4j:log4j</include>
                </includes>
            </binaries>
        </moduleSet>
    </moduleSets>
</assembly>

Neden maven-assembly-plugin log4j'yi tar dosyasına dahil etmeyi reddediyor? PS, derlemenin kapsamını değiştirmeye çalışmak da işe yaramadı. Süper ebeveyn pompasındaki beyanı değiştiremem.


18
2017-11-17 12:01


Menşei


Çocuk pom pomadının olmadığını görebiliyorum. version log4j için? Bu durumda ebeveynin aşırı yüklenme ile tek başına miras kaldığını mı? - JoseK
Versiyonu kendi ana pompasından miras alacaktır. Yine de sürümü eklemeyi denedim, ancak hala hiçbir fark yaratmıyor. - guymi


Cevaplar:


Bu, Assembly eklentisi kullanılarak yapılabilir.

İlk önce bir assembly.xml Takip ederek:

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id>bin</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
        <dependencySet>
            <unpack>true</unpack>
            <scope>provided</scope>
        </dependencySet>
    </dependencySets>
</assembly>

O zaman sadece pom.xml

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <descriptor>src/main/assembly/assembly.xml</descriptor>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
</plugin>

Bu, bir sınıf yolunda başvuruda bulunabilmeleri için tüm derlenmiş ve sağlanan kaynakların patlatılmasını içeren bir projeniz-bin.jar oluşturacaktır.

java -cp yourproject-bin.jar com.yourcompany.Main

11
2018-01-31 00:46



Bağımlılıkları açmak her zaman çok kötü bir fikirdir. Farklı kütüphaneler, aynı konumlarda beans.xml meta-inf gibi ortak dosyalara sahip olabilir. Ne yaptığınızı biliyorsanız, asla bağımlılıkları açmayın. Derlemenizi bir lib / klasöre sahip olacak şekilde düzenleyin. O zaman iyi olacaksın. Orijinal JAR dosyalarını dahil etmeyin herhangi bir şey çıkarmayın! Hiç. - 99Sono


maven'de 'sağlanan' kapsamı geçersiz kılmak mümkün değildir.

Bu sorunu çözmek için, artifakt kapsamını tanımlayacak olan ana pompayı bir değişken olarak beyan ettim. Kapsamı geçersiz kılmak için yapılması gereken tek şey, devralınan pomda değişken için yeni bir değer belirlemektir.

Aşağıdaki örneğe bakın:

ana ponpon:

    <properties>
            <log4j.version>1.2.8</log4j.version>
            <log4j.scope>provided</log4j.scope>
    </properties>
.
.
.
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
                <scope>${log4j.scope}</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

Şimdi çocuk pomda, sadece değişkeni tekrar beyan et:

<properties>
        <log4j.scope>runtime</log4j.scope>
</properties>

10
2017-11-29 11:27



Yönetilen bağımlılığı çocuk POM'unda yöneterek geçersiz kılmak mümkündür. Cevabımı aşağıya bakın. - Zoltán
Oy kullanmak istemiyorum çünkü bir değişken kullanma fikri zorlayıcıdır. Ancak, Zoltan doğrudur - "dependencyManagement" etiket yöntemini kullanarak "sağlanan kapsam" bağımlılığını geçersiz kılabilirsiniz. - Ivan


İçinde bildirerek yönetilen bağımlılığı geçersiz kılabilirsiniz. <dependencyManagement> POM'da, geçersiz kılınmasını istediğiniz etiketi.

Sizin durumunuzda, aşağıdakileri çocuğunuza eklemelisiniz:

<dependencyManagement>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
        <scope>provided</scope>
    </dependency>
</dependencyManagement>

Bunun, ana POM'ın bağımlılık yönetiminde bildirilen her şeyi geçersiz kıldığını, yani çıkamazsınız. version veya scope bildirilmemiş ve miras alınmasını bekler.


4
2018-05-08 13:31



gerçekten güzel bir çözüm! - okutane
ve montajdan daha iyi;) - accreativos


Kapsamı sadece sizin montaj tanımlayıcısı.


0
2017-11-29 11:49



Montaj tanımlayıcısını kullanmaya çalıştım ama hiç işe yaramadı. Ne olursa olsun. - guymi
Maven'in hangi versiyonunu kullanıyorsunuz ve Maven-Assembly-Plugin'in hangi versiyonunu kullanıyorsunuz? - khmarbaise
Maven sürümü 3.0.3, Maven-Assembly-Plugin sürümüne sahip değil, bu yüzden en son. - guymi
Aslında maven 3.0.3, özellikle geçersiz kılınmışsa, süper pompadaki maven-montaj eklentisinin 2.2-beta-5 sürümünü kullanır. Antrun, derleme, bağımlılık ve serbest bırakma eklentileri için sürümleri olan bir <eklenti> bölümü vardır; bu, gelecekte bir noktada kaldırılacaklarını belirten bir yorum içerir. - DuckPuppy


Benzer bir sorunla karşılaştım, "sağlanan" kapsamı olan bir bağımlılıkla bir proje kurmaya çalışıyorum. Bu sorun için bir çözüm buldum:

  • Bağımlılığı "sağlanan" kapsamda bırakın
  • Maven bağımlılık eklentisini kullanarak bağımlılığı hedef klasöre kopyalayın (örnek)
  • Bağımlılığı bir dosya olarak paketlemek için montaj tanımlayıcısında bir fileSet kullanın.

0
2017-12-26 09:37