মাভেন ব্যবহার করে একটি ফ্যাট জার তৈরি করা


118

আমার একটি কোড বেস রয়েছে যা আমি জার হিসাবে বিতরণ করতে চাই। এটিতে বাহ্যিক জারগুলির উপর নির্ভরতাও রয়েছে, যা আমি চূড়ান্ত জারে বান্ডিল করতে চাই।

আমি শুনেছি এটি ব্যবহার করে করা যায় maven-assembly-plug-in, তবে কীভাবে তা আমি বুঝতে পারি না। কেউ আমাকে কিছু উদাহরণে নির্দেশ করতে পারে।

এখনই, আমি চূড়ান্ত জারটি বান্ডিল করতে ফ্যাট জারটি ব্যবহার করছি। আমি ম্যাভেন ব্যবহার করে একই জিনিস অর্জন করতে চাই।

উত্তর:


143

দ্রষ্টব্য: আপনি যদি একটি বসন্ত-বুট অ্যাপ্লিকেশন হন তবে উত্তরের শেষে পড়ুন

আপনার pom.xml সর্বশেষতম সংস্করণে নিম্নলিখিত প্লাগইন যুক্ত করুন at

...
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>CHOOSE LATEST VERSION HERE</version>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>assemble-all</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
...

এই প্লাগ-ইনটি কনফিগার করার পরে, চলমান mvn packageদুটি জার তৈরি করবে: একটিতে কেবল প্রকল্পের ক্লাস রয়েছে এবং একটি দ্বিতীয় চর্বিযুক্ত জারটি "-জার-সাথে-নির্ভরতা" এর প্রত্যয়যুক্ত সমস্ত নির্ভরতা সহ।

আপনি যদি classpathরানটাইমে সঠিক সেটআপ চান তবে নিম্নলিখিত প্লাগইনটিও যুক্ত করুন

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>

বসন্ত বুট অ্যাপ্লিকেশনটির জন্য কেবল নিম্নলিখিত প্লাগইন ব্যবহার করুন (এর উপযুক্ত সংস্করণটি চয়ন করুন)

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <fork>true</fork>
        <mainClass>${start-class}</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

1
এই প্লাগইনটির বর্তমান সংস্করণটি এখন 2.4
গেরদা

13
এটি এখন অবচয় করা হয়েছে এবং পরিবর্তে মাভেন-শেড-প্লাগইন ব্যবহার করা উচিত। @Phlogratos দেখুন আরয stackoverflow.com/a/16222965/274350
রিচার্ড নিশ

2
মেভেন-এসেম্বলি-প্লাগইন কি ফ্যাট জারের আকারকে হ্রাস করতে পারে?
মে 12

1
@ রিচার্ড আপনি কোথায় দেখছেন যে এটি হ্রাস করা হয়েছে? Maven.apache.org/plugins/maven-assembly-plugin
ব্যবহারকারীর 3833308

3
@ ব্যবহারকারী 3833308 "অবচয়" ভুল শব্দ হতে পারে তবে maven.apache.org/plugins/maven-assembly-plugin এ ডকুমেন্টেশন বলছে "যদি আপনার প্রকল্পটি আপনার শিল্পকলাটি একটি উবার-জারে প্যাকেজ করতে চায় তবে সমাবেশ প্লাগইনটি কেবলমাত্র বেসিক সরবরাহ করে সমর্থন। আরও নিয়ন্ত্রণের জন্য, মাভেন শেড প্লাগইন ব্যবহার করুন। "
রিচার্ড নিশ

55

আপনি মাভেন-শেড-প্লাগইন ব্যবহার করতে পারেন ।

আপনার বিল্ডে শেড প্লাগইনটি কনফিগার করার পরে কমান্ডটি এর mvn packageমধ্যে একত্রীকরণের সাথে সমস্ত নির্ভরতা সহ একটি একক জার তৈরি করবে।


9
এটি এখন এটি করার সঠিক উপায়। মাভেন-অ্যাসেম্বলি-প্লাগইন ডকুমেন্টেশনে বলা হয়েছে: "যদি আপনার প্রকল্পটি আপনার শৈল্পিকটিকে একটি উবার-জারে প্যাকেজ করতে চায় তবে এসেম্বলি প্লাগইনটি কেবলমাত্র প্রাথমিক সহায়তা সরবরাহ করে more আরও নিয়ন্ত্রণের জন্য, মাভেন শেড প্লাগইনটি ব্যবহার করুন" "
রিচার্ড নীশ

তবে আমি কীভাবে এই একক .ar গ্রহণ করব এবং এটি প্রকাশের জন্য ব্যবহার করব?
ড্যানগার্ডন

42

maven-shade-pluginদ্বন্দ্ব এড়াতে হয়ত আপনি চান , বান্ডিল নির্ভরতা, অব্যবহৃত কোডটি ছোট করুন এবং বাহ্যিক নির্ভরতা লুকান।

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <minimizeJar>true</minimizeJar>
                        <createDependencyReducedPom>true</createDependencyReducedPom>
                        <dependencyReducedPomLocation>
                            ${java.io.tmpdir}/dependency-reduced-pom.xml
                        </dependencyReducedPomLocation>
                        <relocations>
                            <relocation>
                                <pattern>com.acme.coyote</pattern>
                                <shadedPattern>hidden.coyote</shadedPattern>
                            </relocation>
                        </relocations>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

তথ্যসূত্র:


যদি কারও মুখোমুখি হয় তবে Provider org.apache.xerces.jaxp.SAXParserFactoryImpl not foundসরিয়ে ফেলুন <minimizeJar>true</minimizeJar>
কোপ্পোর

আপনি একটি পেতে যদি "java.lang.SecurityException: অবৈধ স্বাক্ষর ফাইল ম্যানিফেস্ট প্রধান বৈশিষ্ট্য জন্য হজম" ব্যতিক্রম, তারপর উপরে কনফিগারেশন বিভাগে এই ছাড়াও সাহায্য করে: stackoverflow.com/a/6743609/38368
ড্যানি Varod

12

আসলে, যোগ

<archive>
   <manifest>
    <addClasspath>true</addClasspath>
    <packageName>com.some.pkg</packageName>                     
    <mainClass>com.MainClass</mainClass>
  </manifest>
</archive>

মাভেন-জার-প্লাগইন-এ ঘোষণা আমার জন্য ম্যানিফেস্ট ফাইলটিতে প্রধান শ্রেণীর এন্ট্রি যুক্ত করে না। ম্যানিফেস্টে পাওয়ার জন্য আমাকে এটি ম্যাভেন-এসেম্বলি-প্লাগইনে যুক্ত করতে হয়েছিল


5

আপনি প্যাকেজিংয়ের জন্য ওয়ানজার-মাভেন-প্লাগইন ব্যবহার করতে পারেন । মূলত, এটি আপনার প্রকল্প এবং তার নির্ভরতাগুলিকে এক জার হিসাবে একত্রিত করে, কেবল আপনার প্রকল্পের জার ফাইলই নয়, সমস্ত "বাহিতির জার" হিসাবে বহিরাগত নির্ভরতা যেমন eg

<build>
    <plugins>
        <plugin>
            <groupId>com.jolira</groupId>
            <artifactId>onejar-maven-plugin</artifactId>
                <version>1.4.4</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>one-jar</goal>
                        </goals>
                    </execution>
                </executions>
        </plugin>
    </plugins>
</build>

নোট 1: কনফিগারেশন বিকল্পগুলি প্রকল্পের হোম পৃষ্ঠায় উপলভ্য ।

দ্রষ্টব্য 2: এক কারণে বা অন্য কারণে, একজার-মাভেন-প্লাগইন প্রকল্পটি মাভেন সেন্ট্রালে প্রকাশিত হয়নি। তবে jolira.com আসল প্রকল্পটি ট্র্যাক করে এবং এটি গ্রুপ আইডির সাথে প্রকাশ করে com.jolira


আপনি যে প্যাকেজগুলির সাথে প্যাকেজ করতে চান তা কি চয়ন করা সম্ভব? উদাহরণস্বরূপ, যদি আজার এবং বি.জারগুলি বাহ্যিক জার হয় এবং আমি কেবল এজারকে চূড়ান্ত জারে প্যাকেজ করতে চাই, এটি কি কিছু সম্ভব / কনফিগারযোগ্য?
বিয়ানকা

আমি দেখি যে এক-জারের স্টাফগুলি চূড়ান্ত জারেও বান্ডিল হয়ে গেছে। এটি চূড়ান্ত জারের আকার বাড়িয়েছে। চূড়ান্ত জারে অন্তর্ভুক্ত করার উদ্দেশ্যে আপনি যে বাহ্যিক জারগুলি বেছে নিতে চান তা চয়ন করা কি সম্ভব? এখানে এক-জারের লগগুলি রয়েছে: পেস্টবিন.com
উউনিউকিজে 2

আমি জানি না আপনি কী অন্তর্ভুক্ত রয়েছে তা কনফিগার করতে পারবেন কিনা। মূলত, ওয়ান-জারটিতে ট্রানজিটিভ নির্ভরতা সহ আপনার প্রকল্পের দ্বারা নির্দিষ্ট করা সমস্ত নির্ভরতা অন্তর্ভুক্ত থাকে, সুতরাং হ্যাঁ, আপনার অনেক নির্ভরতা থাকলে চূড়ান্ত জারটি বড় হয়ে উঠতে পারে। "জারের পাত্র" কাঠামোর সাথে জাভা কাজ করার জন্য কিছু ওভারহেড ওয়ান-জার দ্বারা যুক্ত করা হবে।
matsev

2

একটি বিকল্প হ'ল মেকেন শেড প্লাগইনটি একটি তৈরির জন্য ব্যবহার করা uber-jar

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version> Your Version Here </version>
    <configuration>
            <!-- put your configurations here -->
    </configuration>
    <executions>
            <execution>
                    <phase>package</phase>
                    <goals>
                            <goal>shade</goal>
                    </goals>
            </execution>
    </executions>
</plugin>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.