আমি আমার প্রকল্পটি বিতরণের জন্য একক এক্সিকিউটেবল জেআর-তে প্যাকেজ করতে চাই।
আমি কীভাবে কোনও আউটপুট জেআর-তে সমস্ত নির্ভরতা জেআরগুলিকে কোনও মাভেন প্রকল্প প্যাকেজ তৈরি করতে পারি?
আমি আমার প্রকল্পটি বিতরণের জন্য একক এক্সিকিউটেবল জেআর-তে প্যাকেজ করতে চাই।
আমি কীভাবে কোনও আউটপুট জেআর-তে সমস্ত নির্ভরতা জেআরগুলিকে কোনও মাভেন প্রকল্প প্যাকেজ তৈরি করতে পারি?
উত্তর:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
এবং আপনি এটি দিয়ে চালানো
mvn clean compile assembly:single
সমাবেশের আগে সংকলনের লক্ষ্য যুক্ত করা উচিত: একক বা অন্যথায় আপনার নিজের প্রকল্পের কোড অন্তর্ভুক্ত নয়।
মন্তব্যে আরও বিশদ দেখুন।
সাধারণত এই লক্ষ্যটি স্বয়ংক্রিয়ভাবে সম্পাদন করতে কোনও বিল্ড ফেজের সাথে আবদ্ধ। এটি নিশ্চিত করে যে কোনও জারি mvn install
/ প্রকাশের কাজ সম্পাদন বা সম্পাদন করার সময় জেআর তৈরি হয়েছিল ।
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
mvn clean compile assembly:single
.
<appendAssemblyId>false</appendAssemblyId>
মধ্যে configuration
নামে বিরক্তিকর "-jar-সঙ্গে-নির্ভরতা" প্রত্যয় এড়াতে
compile
এবং আপনি ভ্রষ্ট।
আপনি প্যাকেজ পর্বের আগে পৃথক ডিরেক্টরিতে সমস্ত নির্ভরতা উত্পন্ন করতে নির্ভরতা-প্লাগইন ব্যবহার করতে পারেন এবং তারপরে ম্যানিফেস্টের শ্রেণিপথটিতে অন্তর্ভুক্ত করুন:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>theMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
বিকল্পভাবে ${project.build.directory}/classes/lib
সমস্ত জার-ফাইলগুলিকে মূল জারে সংহত করার জন্য আউটপুট ডিরেক্টরি হিসাবে ব্যবহার করুন তবে তারপরে আপনাকে জারগুলি লোড করার জন্য কাস্টম শ্রেণিবদ্ধকরণ কোড যুক্ত করতে হবে।
${project.build.directory}/classes/lib
হিসাবে ব্যবহার করি outputDirectory
তবে - এই জারগুলি লোড করার জন্য কীভাবে কাস্টম শ্রেণিবদ্ধকরণ কোড যুক্ত করব? আমি কাজ সম্পাদন করতে হবে: java -jar main-jar-with-deps.jar
। এটা কি সম্ভব ?
এটি করার বিভিন্ন উপায় সম্পর্কে আমি ব্লগ করেছি।
অ্যাপাচি মাভেনের সাথে এক্সিকিউটেবল জার দেখুন (ওয়ার্ডপ্রেস) এর
বা নির্বাহযোগ্য-জার-সাথে-মাভেন-উদাহরণ (গিটহাব)
সেই আগপাছ দ্বারা উপলব্ধ করা হয় স্টিফেন ।
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/${project.build.finalName}.lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>${project.build.finalName}.lib/</classpathPrefix>
<mainClass>${fully.qualified.main.class}</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
এই মুহুর্তে jar
বাহ্যিক শ্রেণিপথ উপাদানগুলির সাথে প্রকৃতপক্ষে নির্বাহযোগ্য।
$ java -jar target/${project.build.finalName}.jar
jar
ফাইলটি কেবল ভাইবোন ...lib/
ডিরেক্টরি সহ কার্যকর করা যায়। ডিরেক্টরি এবং এর বিষয়বস্তু স্থাপন করার জন্য আমাদের সংরক্ষণাগারগুলি তৈরি করতে হবে।
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>antrun-archive</id>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target>
<property name="final.name" value="${project.build.directory}/${project.build.finalName}"/>
<property name="archive.includes" value="${project.build.finalName}.${project.packaging} ${project.build.finalName}.lib/*"/>
<property name="tar.destfile" value="${final.name}.tar"/>
<zip basedir="${project.build.directory}" destfile="${final.name}.zip" includes="${archive.includes}" />
<tar basedir="${project.build.directory}" destfile="${tar.destfile}" includes="${archive.includes}" />
<gzip src="${tar.destfile}" destfile="${tar.destfile}.gz" />
<bzip2 src="${tar.destfile}" destfile="${tar.destfile}.bz2" />
</target>
</configuration>
</execution>
</executions>
</plugin>
এখন আপনার কাছে target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz)
প্রতিটিটিতে jar
এবং রয়েছে lib/*
।
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<archive>
<manifest>
<mainClass>${fully.qualified.main.class}</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</execution>
</executions>
</plugin>
আপনার আছে target/${project.bulid.finalName}-jar-with-dependencies.jar
।
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>${fully.qualified.main.class}</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
আপনার আছে target/${project.build.finalName}-shaded.jar
।
<plugin>
<!--groupId>org.dstovall</groupId--> <!-- not available on the central -->
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<executions>
<execution>
<configuration>
<mainClass>${fully.qualified.main.class}</mainClass>
<attachToBuild>true</attachToBuild>
<!-- https://code.google.com/p/onejar-maven-plugin/issues/detail?id=8 -->
<!--classifier>onejar</classifier-->
<filename>${project.build.finalName}-onejar.${project.packaging}</filename>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>spring-boot</classifier>
<mainClass>${fully.qualified.main.class}</mainClass>
</configuration>
</execution>
</executions>
</plugin>
আপনার আছে target/${project.bulid.finalName}-spring-boot.jar
।
উত্তরহীনদের উত্তর নেওয়া এবং এটি পুনরায় ফর্ম্যাট করা, আমাদের কাছে রয়েছে:
<build>
<plugins>
<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>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
এরপরে, আমি স্পষ্ট করে কিছু বলার চেয়ে এটি আপনার বিল্ডের একটি প্রাকৃতিক অংশ করার পরামর্শ দেব। এটি আপনার বিল্ডের অবিচ্ছেদ্য অঙ্গ হিসাবে তৈরি করতে, আপনার এই প্লাগইনটি যুক্ত করুন pom.xml
এবং এটি package
জীবনচক্র ইভেন্টে আবদ্ধ করুন । যাইহোক, একটি assembly:single
গ্যাচা হ'ল কমান্ড লাইন থেকে ম্যানুয়ালি সম্পাদন করা হলে আপনি 'এসেম্বলি: এসেম্বলি' নামক কলটি যখন আপনার পম.এক্সএমএল এ রেখেছেন তবে আপনাকে লক্ষ্যটি কল করতে হবে।
<project>
[...]
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
[...]
</plugins>
[...]
</build>
</project>
সমস্ত নির্ভরতাগুলিকে একটি উবার-জারে প্যাকেজ করতে মাভেন-শেড-প্লাগইন ব্যবহার করুন। এটি প্রধান বর্গ নির্দিষ্ট করে একটি নির্বাহযোগ্য জার তৈরিতেও ব্যবহার করা যেতে পারে। মাভেন-এসেম্বলি এবং মাভেন-জারটি ব্যবহার করার চেষ্টা করার পরে, আমি দেখতে পেলাম যে এই প্লাগইনটি আমার প্রয়োজনগুলির জন্য সবচেয়ে উপযুক্ত।
আমি এই প্লাগইনটি বিশেষভাবে দরকারী হিসাবে এটি নির্দিষ্ট ফাইলগুলির ওভাররাইটের পরিবর্তে সামগ্রীগুলির মার্জ করে। জার জুড়ে একই নামে থাকা রিসোর্স ফাইল থাকা অবস্থায় এটি প্রয়োজন হয় এবং প্লাগইন সমস্ত রিসোর্স ফাইল প্যাকেজ করার চেষ্টা করে
নীচে উদাহরণ দেখুন
<plugins>
<!-- This plugin provides the capability to package the artifact in an uber-jar, including its dependencies and to shade - i.e. rename - the packages of some of the dependencies. -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<artifactSet>
<!-- signed jars-->
<excludes>
<exclude>bouncycastle:bcprov-jdk15</exclude>
</excludes>
</artifactSet>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!-- Main class -->
<mainClass>com.main.MyMainClass</mainClass>
</transformer>
<!-- Use resource transformers to prevent file overwrites -->
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>properties.properties</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>applicationContext.xml</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/cxf/cxf.extension</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.XmlAppendingTransformer">
<resource>META-INF/cxf/bus-extensions.xml</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
দীর্ঘকাল ধরে মভেন অ্যাসেমব্লিং প্লাগইন ব্যবহৃত হয়েছে , তবে আমি সমস্যার কোনও সমাধান খুঁজে পাইনি "already added, skipping"
। এখন, আমি অন্য একটি প্লাগইন ব্যবহার করছি - onejar-maven-પ્લગઇન । নীচে উদাহরণ ( mvn package
জার বিল্ড):
<plugin>
<groupId>org.dstovall</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.3.0</version>
<executions>
<execution>
<configuration>
<mainClass>com.company.MainClass</mainClass>
</configuration>
<goals>
<goal>one-jar</goal>
</goals>
</execution>
</executions>
</plugin>
আপনাকে এই প্লাগইনটির জন্য ভান্ডার যুক্ত করতে হবে:
<pluginRepositories>
<pluginRepository>
<id>onejar-maven-plugin.googlecode.com</id>
<url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url>
</pluginRepository>
</pluginRepositories>
আপনি মাভেন-নির্ভরতা-প্লাগইন ব্যবহার করতে পারেন, তবে কীভাবে কার্যনির্বাহী জেআর তৈরি করবেন তা প্রশ্ন ছিল। এটি করার জন্য ম্যাথু ফ্রাংলিনের প্রতিক্রিয়ার নিম্নলিখিত পরিবর্তনের প্রয়োজন (বিটিডব্লিউ, নির্ভরতা প্লাগইন ব্যবহার করে পরিষ্কার লক্ষ্য থেকে শুরু করার সময় তৈরি করতে আরও বেশি সময় লাগে):
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>${basedir}/target/dependency</directory>
</resource>
</resources>
</build>
আপনি নীচের মত একটি উবার জার তৈরি করতে মাভেন-শেড প্লাগইন ব্যবহার করতে পারেন
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
আপনি যদি সত্যিই আপনার একক ফলাফল জেআর-এর ভিতরে থাকা অন্যান্য জেআর বিষয়বস্তুগুলি পুনরায় প্যাকেজ করতে চান তবে অন্য একটি বিকল্প হ'ল মাভেন অ্যাসেমব্লিং প্লাগইন । এটি আনপ্যাক করে এবং তারপরে সমস্ত ডিরেক্টরিটিকে ডিরেক্টরিতে পুনরায় পোস্ট করে <unpack>true</unpack>
। তারপরে আপনার কাছে দ্বিতীয় পাস রয়েছে যা এটিকে একটি বিশাল জেআর হিসাবে তৈরি করেছে।
আর একটি বিকল্প ওয়ানজার প্লাগইন । এটি এক ধাপে সমস্ত উপরের পুনঃস্থাপনের ক্রিয়া সম্পাদন করে।
আপনি আপনার pom.xml এ নিম্নলিখিতগুলি যুক্ত করতে পারেন :
<build>
<defaultGoal>install</defaultGoal>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.mycompany.package.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.mycompany.package.MainClass</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
এর পরে আপনাকে কনসোলের মাধ্যমে ডিরেক্টরিতে স্যুইচ করতে হবে, যেখানে pom.xML অবস্থিত। তারপরে আপনাকে এমভিএন সমাবেশ কার্যকর করতে হবে : একক এবং তারপরে নির্ভরতার সাথে আপনার এক্সিকিউটেবল জেআর ফাইলটি আশাবাদী নির্মিত হবে fully সিডি। / ডেটের সাথে আউটপুট (টার্গেট) ডিরেক্টরিতে স্যুইচ করার সময় এবং জাভা-জার-মাভেনপ্রজেক্ট 1-1.0-এসএনএপিএসশট-জার-নির্ভরশীলতা.জারের সাথে সমান কমান্ডের সাহায্যে আপনার জার শুরু করার সময় আপনি এটি পরীক্ষা করতে পারেন can ।
আমি এটি অ্যাপাচি মাভেন 3.0.3 দিয়ে পরীক্ষা করেছি ।
আমি সমস্ত প্রতিক্রিয়াযুক্ত একটি চর্বি নির্বাহযোগ্য জার তৈরি করার জন্য এই প্রতিক্রিয়াগুলির প্রত্যেকটির মধ্য দিয়ে গিয়েছিলাম এবং তাদের কোনওটিই সঠিকভাবে কাজ করেনি। উত্তরটি শেড প্লাগইন, এটি খুব সহজ এবং সোজা।
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<!-- Run shade goal on package phase -->
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>path.to.MainClass</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
সচেতন হন যে আপনার নির্ভরতাগুলির সঠিকভাবে কাজ করার জন্য সংকলন বা রানটাইমের সুযোগ থাকতে হবে।
plugin
উপাদান যায় pom.xml
অধীনে build/plugins
।
আপনি maven-shade-plugin
এবং একত্রিত করতে পারে maven-jar-plugin
।
maven-shade-plugin
একটি একক বয়াম ফাইলে আপনার ক্লাস এবং সব নির্ভরতা প্যাকগুলি।maven-jar-plugin
আপনার এক্সিকিউটেবল জারের মূল শ্রেণি নির্দিষ্ট করার জন্য কনফিগার করুন ( ক্লাসপাথ সেটআপ করুন , অধ্যায় "জারটি এক্সিকিউটেবল করুন" দেখুন)।এর জন্য পিওএম কনফিগারেশন উদাহরণ maven-jar-plugin
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.example.MyMainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
অবশেষে অনুরোধ করে সম্পাদনযোগ্য জার তৈরি করুন:
mvn clean package shade:shade
কেন লিউ আমার মতামত ঠিক আছে। মাভেন নির্ভরতা প্লাগইন আপনাকে সমস্ত নির্ভরতা প্রসারিত করতে দেয় যা আপনি এরপরে সংস্থান হিসাবে বিবেচনা করতে পারবেন। এটি আপনাকে সেগুলিকে প্রধান নিদর্শনগুলিতে অন্তর্ভুক্ত করতে দেয় । সমাবেশ প্লাগইনের ব্যবহার একটি মাধ্যমিক শৈল্পিক তৈরি করে যা সংশোধন করা কঠিন হতে পারে - আমার ক্ষেত্রে আমি কাস্টম মেনিফেস্ট এন্ট্রি যুক্ত করতে চেয়েছিলাম। আমার পোমটি শেষ হয়েছে:
<project>
...
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
...
<resources>
<resource>
<directory>${basedir}/target/dependency</directory>
<targetPath>/</targetPath>
</resource>
</resources>
</build>
...
</project>
এটি এমন হওয়া উচিত:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>generate-resources</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
আনপ্যাকিংটি জেনারেট-রিসোর্স পর্যায়ে থাকতে হবে কারণ প্যাকেজ পর্যায়ে থাকলে তা সংস্থান হিসাবে অন্তর্ভুক্ত হবে না। পরিষ্কার প্যাকেজ চেষ্টা করুন এবং আপনি দেখতে পাবেন।
ম্যাভেন-এসেম্বলি-প্লাগইন -২.২.১ এর সাথে ভাগ করা অ্যাসেমবিলি ফাইলটি সনাক্ত করতে সমস্যা?
বর্ণনাকারী / বর্ণনাকারী বা বর্ণনাকারী রেফ / বিবরণকারী রেফ পরামিতিগুলির পরিবর্তে বর্ণনাকারী আইডি কনফিগারেশন প্যারামিটার ব্যবহার করার চেষ্টা করুন।
তাদের কেউই আপনার যা প্রয়োজন তা করেন না: ক্লাসপাথের ফাইলটি সন্ধান করুন। অবশ্যই আপনাকে প্যাকেজ যুক্ত করতে হবে যেখানে ভাগ করা সমাবেশ মেমেন-এসেম্বলি-প্লাগইন এর ক্লাসপাথে থাকে (নীচে দেখুন)। আপনি যদি ম্যাভেন ২.x (ম্যাভেন ৩.x না) ব্যবহার করছেন তবে আপনার প্লাগইনম্যানেজমেন্ট বিভাগে শীর্ষস্থানীয় প্যারেন্ট pom.xML এ এই নির্ভরতা যুক্ত করার প্রয়োজন হতে পারে।
দেখুন এই আরো বিস্তারিত জানার জন্য।
শ্রেণি: org.apache.maven.plugin.asorses.io.DefaultAs असقাইজ রিডার
উদাহরণ:
<!-- Use the assembly plugin to create a zip file of all our dependencies. -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<configuration>
<descriptorId>assembly-zip-for-wid</descriptorId>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>cz.ness.ct.ip.assemblies</groupId>
<artifactId>TEST_SharedAssemblyDescriptor</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
</plugin>
এই সমস্যাটি সমাধান করার জন্য আমরা মাভেন অ্যাসেম্বলি প্লাগইন ব্যবহার করব যা এর নির্ভরতা জেআআআর একসাথে একক এক্সিকিউটেবল জেআর ফাইল হিসাবে জেআর তৈরি করবে। আপনার পম.এমএমএল ফাইলটিতে প্লাগইন কনফিগারেশনটি কেবল নীচে যুক্ত করুন।
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.your.package.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
এটি করার পরে এই কমান্ডটি mvn ক্লিন কম্পাইল অ্যাসেম্বলি: একক দিয়ে MAVEN টুলটি চালাতে ভুলবেন না
অন্যরা ইতিমধ্যে এর আগে যেমনটি করে ফেলেছে আমি সরাসরি প্রশ্নের উত্তর দেব না, তবে আমি সত্যিই ভাবছি যে প্রকল্পের জারে নিজেই সমস্ত নির্ভরতা এম্বেড করা ভাল ধারণা কিনা।
আমি পয়েন্টটি দেখছি (স্থাপনা / ব্যবহারের সহজতা) তবে এটি আপনার পোজেক্টের ব্যবহারের ক্ষেত্রে নির্ভর করে (এবং বিকল্প থাকতে পারে (নীচে দেখুন))।
আপনি যদি এটি পুরোপুরি এককভাবে ব্যবহার করেন তবে কেন করবেন না।
তবে আপনি যদি অন্য প্রকল্পে আপনার প্রকল্পটি ব্যবহার করেন (যেমন একটি ওয়েবঅ্যাপে, বা এমন ফোল্ডারে যেখানে অন্যান্য জারগুলি বসে থাকে), আপনার ক্লাসপথে জার সদৃশ থাকতে পারে (ফোল্ডারে থাকা একটি, জারের মধ্যে একটি)। হয়তো বিডের চুক্তি না হলেও আমি সাধারণত এটি এড়াতে পারি।
একটি ভাল বিকল্প:
এটির মতো, শেষ পর্যন্ত কেবল একটি ম্যানিফেস্ট এবং একটি "বিশেষ গতিশীল ক্লাসলোডার মেইন" দিয়ে আপনি আপনার প্রকল্পটি এর সাথে শুরু করতে পারেন:
java -jar ProjectMainJar.jar com.stackoverflow.projectName.MainDynamicClassLoaderClass
কমান্ড লাইন থেকে নিজে একটি এক্সিকিউটেবল জেআর তৈরি করতে কেবল প্রকল্পের পথ থেকে নীচের কমান্ডটি চালান:
mvn assembly:assembly
pom.xml
অন্যথায় আপনি যে জিনিসটি পাবেন তাতে আপনার এখনও কিছু স্টাফ করা দরকার Error reading assemblies: No assembly descriptors found.
। আমার ক্ষেত্রে যা হয় তা-ই হয়।
এটি আমি খুঁজে পেয়েছি সেরা উপায়:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.myDomain.etc.MainClassName</mainClass>
<classpathPrefix>dependency-jars/</classpathPrefix>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/dependency-jars/
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
এই কনফিগারেশন সহ, সমস্ত নির্ভরতা মধ্যে অবস্থিত হবে /dependency-jars
। আমার অ্যাপ্লিকেশনটির কোনও Main
শ্রেণি নেই, কেবল প্রসঙ্গ প্রবন্ধ রয়েছে, তবে আমার নির্ভরতার মধ্যে একটিতে Main
ক্লাস ( com.myDomain.etc.MainClassName
) রয়েছে যা জেএমএক্স সার্ভার শুরু করে এবং একটি start
বা একটি stop
প্যারামিটার গ্রহণ করে । সুতরাং এটির সাহায্যে আমি আমার অ্যাপ্লিকেশনটি এভাবে শুরু করতে সক্ষম হয়েছি:
java -jar ./lib/TestApp-1.0-SNAPSHOT.jar start
আমি অপেক্ষা করি এটি আপনার সকলের জন্য কার্যকর হবে।
আমি এই পোস্টে উল্লিখিত ট্রি প্লাগইনগুলির সাথে তুলনা করেছি। আমি 2 জার এবং সমস্ত জার সহ একটি ডিরেক্টরি তৈরি করেছি। আমি ফলাফলগুলি তুলনা করেছি এবং অবশ্যই মভেন শেড-প্লাগইন সেরা the আমার চ্যালেঞ্জটি ছিল যে আমার কাছে একাধিক বসন্ত সংস্থান আছে যা মার্জ করার দরকার ছিল, পাশাপাশি জ্যাক্স-আরএস এবং জেডিবিসি পরিষেবাগুলি। তারা সবাই শেভ প্লাগইন দ্বারা ম্যাভেন-অ্যাসেমব্লিং-প্লাগইনের সাথে তুলনায় সঠিকভাবে মার্জ করা হয়েছিল। কোন ক্ষেত্রে বসন্তটি ব্যর্থ হবে যদি না আপনি এগুলিকে আপনার নিজের রিসোর্স ফোল্ডারে অনুলিপি করেন এবং একবারে ম্যানুয়ালি মার্জ করে। উভয় প্লাগইন সঠিক নির্ভরতা ট্রি আউটপুট। আমার কাছে পরীক্ষা, সরবরাহ, সংকলন ইত্যাদি পরীক্ষার মতো একাধিক স্কোপ ছিল এবং সরবরাহিত উভয় প্লাগইন এড়িয়ে যায়। তারা উভয়ই একই ম্যানিফেস্ট উত্পাদন করেছিল তবে আমি তাদের ট্রান্সফর্মার ব্যবহার করে শেড প্লাগইন সহ লাইসেন্স একীভূত করতে সক্ষম হয়েছি। অবশ্যই আপনি ডন 'মভেন-নির্ভরতা-প্লাগইন সহ জারগুলি উত্তোলন করা হয়নি বলে এই সমস্যাগুলি রয়েছে। তবে অন্যদের মতো ঠিক মতো কাজ করার জন্য আপনাকে একটি অতিরিক্ত ফাইল (গুলি) বহন করতে হবে। এখানে pom.xML এর একটি স্নিপ দেওয়া আছে
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<includeScope>compile</includeScope>
<excludeTransitive>true</excludeTransitive>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.rbccm.itf.cdd.poller.landingzone.LandingZonePoller</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-my-jar-with-dependencies</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
<shadedArtifactAttached>false</shadedArtifactAttached>
<keepDependenciesWithProvidedScope>false</keepDependenciesWithProvidedScope>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/services/javax.ws.rs.ext.Providers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.factories</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.tooling</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
<transformer implementation="org.apache.maven.plugins.shade.resource.ApacheLicenseResourceTransformer">
</transformer>
</transformers>
</configuration>
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
আমার পক্ষে কাজ করে এমন কিছু ছিল:
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>unpack-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<id>unpack-dependencies</id>
<phase>package</phase>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>SimpleKeyLogger</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
আমার অসাধারণ কেস ছিল কারণ আমার নির্ভরতা সিস্টেম এক:
<dependency>
..
<scope>system</scope>
<systemPath>${project.basedir}/lib/myjar.jar</systemPath>
</dependency>
আমি @ ব্যবহারকারী 189057 দ্বারা প্রদত্ত কোডটি পরিবর্তনের মাধ্যমে পরিবর্তন করেছি: 1) "প্রস্তুত-প্যাকেজ" পর্যায়ে ম্যাভেন-নির্ভরতা-প্লাগইন সম্পাদন করা হয় 2) আমি সরাসরি "টার্গেট / ক্লাস" এ প্যাকবিহীন সংঘর্ষ বের করছি
আমি এখানে সর্বাধিক ভোট দেওয়া উত্তর চেষ্টা করেছি, এবং জার চালাতে সক্ষম হয়েছি। তবে প্রোগ্রামটি সঠিকভাবে চলেনি। কারণটা কী ছিল জানি না। আমি যখন থেকে চালানোর চেষ্টা করিEclipse
অন্যরকম ফলাফল পাই তবে কমান্ড-লাইন থেকে জার চালানোর সময় আমি একটি আলাদা ফলাফল পাই (এটি একটি প্রোগ্রাম-নির্দিষ্ট রানটাইম ত্রুটির সাথে ক্র্যাশ হয়)।
ওপি হিসাবে আমারও একই প্রয়োজনীয়তা ছিল যে আমার প্রকল্পের জন্য আমার অনেক বেশি (ম্যাভেন) নির্ভরতা ছিল। ভাগ্যক্রমে, আমার জন্য একমাত্র সমাধানটি কাজ করেছিল তা হ'ল ব্যবহার Eclipse
। খুব সাধারণ এবং খুব সোজা। এটি ওপি-র কোনও সমাধান নয় তবে এমন একটি ব্যক্তির সমাধান যা একই রকম প্রয়োজন তবে অনেকগুলি ম্যাভেন নির্ভরতা সহ,
1) আপনার প্রকল্প ফোল্ডারে (Eclipse এ) ডান-ক্লিক করুন এবং নির্বাচন করুন Export
2) তারপরে Java
-> নির্বাচন করুনRunnable Jar
3) আপনাকে জার ফাইলটির অবস্থান চয়ন করতে বলা হবে
4) অবশেষে, আপনি যে প্রধান পদ্ধতিটি চালাতে চান তা নির্বাচন করুন Package dependencies with the Jar file
এবং ক্লিক করুন এবং ক্লিক করুনFinish
এটি একটি বিকল্পও হতে পারে, আপনি আপনার জার ফাইলটি তৈরি করতে সক্ষম হবেন
<build>
<plugins>
<plugin>
<!-- Build an executable JAR -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>WordListDriver</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
উবার-জার থেকে নির্দিষ্ট নির্ভরতা বাদ দেওয়ার জন্য বিকল্পগুলির সন্ধানকারী যে কোনও ব্যক্তির জন্য, এটি এমন একটি সমাধান যা আমার পক্ষে কাজ করেছে:
<project...>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>1.6.1</version>
<scope>provided</scope> <=============
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>...</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
সুতরাং এটি এমভিএন-এসেম্বলি-প্লাগইনটির কনফিগারেশন নয় বরং নির্ভরতার সম্পত্তি।
ইতিমধ্যে লক্ষ লক্ষ উত্তর রয়েছে, আমি <mainClass>
আপনার অ্যাপ্লিকেশনটিতে এন্ট্রিপয়েন্ট যুক্ত করার প্রয়োজন না হলে আপনার প্রয়োজন নেই এমনটি যুক্ত করতে চেয়েছিলাম। উদাহরণস্বরূপ, APIs এর অগত্যা main
পদ্ধতি থাকতে পারে না ।
<build>
<finalName>log-enrichment</finalName>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
mvn clean compile assembly:single
ll target/
total 35100
drwxrwx--- 1 root vboxsf 4096 Sep 29 16:25 ./
drwxrwx--- 1 root vboxsf 4096 Sep 29 16:25 ../
drwxrwx--- 1 root vboxsf 0 Sep 29 16:08 archive-tmp/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 classes/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 generated-sources/
drwxrwx--- 1 root vboxsf 0 Sep 29 16:25 generated-test-sources/
-rwxrwx--- 1 root vboxsf 35929841 Sep 29 16:10 log-enrichment-jar-with-dependencies.jar*
drwxrwx--- 1 root vboxsf 0 Sep 29 16:08 maven-status/
Pom.xML এ যুক্ত করুন:
<dependency>
<groupId>com.jolira</groupId>
<artifactId>onejar-maven-plugin</artifactId>
<version>1.4.4</version>
</dependency>
এবং
<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>
এটাই. পরবর্তী এমভিএন প্যাকেজ সমস্ত নির্ভরতা জারগুলি সহ অতিরিক্তভাবে একটি ফ্যাট জার তৈরি করবে।
মাভেন-অ্যাসেম্বলি-প্লাগইন আমার জন্য দুর্দান্ত কাজ করেছে। আমি মাভেন-নির্ভরতা-প্লাগইন সহ ঘন্টা কাটিয়েছি এবং এটি কাজ করতে পারি না। মূল কারণটি হ'ল আমাকে কনফিগারেশন বিভাগে স্পষ্টভাবে শিল্পকর্ম আইটেমগুলি সংজ্ঞায়িত করতে হয়েছিল যা ডকুমেন্টেশনে বর্ণিত হিসাবে এটি অন্তর্ভুক্ত করা উচিত । আপনি যখন এটির মতো ব্যবহার করতে চান তখন এর উদাহরণগুলির একটি উদাহরণ রয়েছে: mvn dependency:copy
যেখানে কোনও আর্টিফ্যাক্ট আইটেম অন্তর্ভুক্ত থাকে না তবে এটি কার্যকর হয় না।
এই ব্লগ পোস্টটি মাভেন-জার এবং মাভেন-এসেম্বলি প্লাগইনগুলির সংমিশ্রণের সাথে আরেকটি পন্থা দেখায়। ব্লগ পোস্ট থেকে অ্যাসেম্বলি কনফিগারেশন এক্সএমএল এর সাহায্যে নির্ভরতাগুলি প্রসারিত হবে বা কেবল একটি ফোল্ডারে সংগ্রহ করা হবে এবং ম্যানিফেস্টে শ্রেণিপথ এন্ট্রি দ্বারা রেফারেন্স করা হলে এটিও নিয়ন্ত্রণ করা যেতে পারে:
আদর্শ সমাধান হ'ল জারগুলি একটি লিবিব ফোল্ডারে অন্তর্ভুক্ত করা এবং প্রধান জারের ম্যানিফেস্ট.এমএফ ফাইলটি ক্লাসপথে সমস্ত জার অন্তর্ভুক্ত করে।
এবং ঠিক এখানে একটি বর্ণিত হয়েছে: https://caffebig.wordpress.com/2013/04/05/executable-jar-file-with-d dependent-jars- using-maven/
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4.1</version>
<configuration>
<!-- get all project dependencies -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<!-- bind to the packaging phase -->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
ঠিক আছে, তাই এটি আমার সমাধান। আমি জানি এটি pom.xML ফাইলটি ব্যবহার করছে না not তবে নেটবিনে আমার প্রোগ্রামিং সংকলন এবং চলমান সমস্যাটি আমার ছিল কিন্তু আমি জাভা-মাইজারফাইল.জার চেষ্টা করার সময় ব্যর্থ হয়েছিল। এখন, আমি মাভেনকে পুরোপুরি বুঝতে পারছি না এবং আমি মনে করি যে আমার জারের ফাইলটিকে একটি জার ফাইলে রাখার জন্য আমার জার ফাইলটি একটি লাইব্রেরিতে অন্তর্ভুক্ত করতে নেটবিন্স 8.0.2 পেতে কেন সমস্যা হচ্ছে। আমি ভাবছিলাম যে আমি কীভাবে একলাইসে কোনও ম্যাভেন না রেখে জার ফাইলগুলি ব্যবহার করব।
এটি ম্যাভেন যা সমস্ত নির্ভরশীলতা এবং প্লাগইন সংকলন করতে পারে। নেটবিন নয়। (যদি আপনি নেটবিন পেতে এবং জাভা ব্যবহার করতে সক্ষম হন তবে এটি করতে দয়া করে আমাকে বলুন (^। ^) ভি)
[সমাধান করা - লিনাক্সের জন্য] একটি টার্মিনাল খোলার মাধ্যমে।
তারপর
cd /MyRootDirectoryForMyProject
পরবর্তী
mvn org.apache.maven.plugins:maven-compiler-plugin:compile
পরবর্তী
mvn install
এটি লক্ষ্য ডিরেক্টরিতে জার ফাইল তৈরি করবে।
MyJarFile-1.0-jar-with-dependencies.jar
এখন
cd target
(আপনার চালানোর দরকার হতে পারে: chmod +x MyJarFile-1.0-jar-with-dependencies.jar
:)
এবং পরিশেষে
java -jar MyJarFile-1.0-jar-with-dependencies.jar
দয়া করে দেখুন
https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException
আমি এই সমাধানটি একই ধরণের সমস্যার সাথে আরও কয়েকটি পৃষ্ঠায় পোস্ট করব। আশা করি আমি এক সপ্তাহের হতাশার হাত থেকে কাউকে বাঁচাতে পারি।