মাভেনের সাথে এক্সিকিউটেবল জারে তৈরি?


122

আমি মাভেন ব্যবহার করে "লগম্যানেজার" নামে একটি ছোট হোম প্রকল্পের জন্য একটি এক্সিকিউটেবল জার তৈরি করার চেষ্টা করছি:

মাভেন ব্যবহার করে নির্ভরতার সাথে আমি কীভাবে এক্সিকিউটেবল জেআর তৈরি করতে পারি?

আমি সেখানে প্রদর্শিত স্নিপেটকে pom.xML এ যুক্ত করেছি, এবং mvn সমাবেশটি চালিয়েছি: সমাবেশ assembly এটি লগম্যানেজার / টার্গেটে দুটি জার ফাইল উত্পন্ন করে: লগম্যানেজার -১.০.০.জার, এবং লগম্যানেজার -১.০.০-জার-নির্ভরতা-নির্ভরতা সহ jar আমি প্রথম জারে ডাবল ক্লিক করলে আমি একটি ত্রুটি পেয়েছি:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

আমি যখন নির্ভরতা সহ জারের সাথে ডাবল ক্লিক করি তখন কিছুটা ভিন্ন ত্রুটি:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

আমি পথ এবং ক্লাসের নামটি অনুলিপি করে আটকে দিয়েছি এবং POM এ বানানটি পরীক্ষা করেছি। আমার মূল ক্লাসটি একটি গ্রহন লঞ্চ কনফিগারেশন থেকে সূক্ষ্ম প্রবর্তন করে। আমার জার ফাইলটি কেন চলবে না তা বুঝতে কেউ আমাকে সাহায্য করতে পারে? এছাড়াও, কেন দুটি জার দিয়ে শুরু হবে? আপনার যদি আরো তথ্য লাগে তবে আমাকে জানাবেন।

pom.xmlরেফারেন্সের জন্য এখানে পূর্ণ

<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.gorkwobble</groupId>
  <artifactId>logmanager</artifactId>
  <name>LogManager</name>
  <version>0.1.0</version>
  <description>Systematically renames specified log files on a scheduled basis. Designed to help manage MUSHClient logging and prevent long, continuous log files.</description>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.2</version>
            <!-- nothing here -->
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2-beta-4</version>
            <configuration>
              <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
              </descriptorRefs>
              <archive>
                <manifest>
                  <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
                </manifest>
              </archive>
            </configuration>
            <executions>
              <execution>
                <phase>package</phase>
                <goals>
                  <goal>single</goal>
                </goals>
              </execution>
            </executions>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <source>1.6</source>
              <target>1.6</target>
            </configuration>
          </plugin>
    </plugins>
  </build>
  <dependencies>
    <!-- commons-lang -->
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>2.4</version>
    </dependency> 

    <!-- Quartz scheduler -->
    <dependency>
        <groupId>opensymphony</groupId>
        <artifactId>quartz</artifactId>
        <version>1.6.3</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons collections -->
    <dependency>
      <groupId>commons-collections</groupId>
      <artifactId>commons-collections</artifactId>
      <version>3.1</version>
    </dependency>
    <!-- Quartz 1.6.0 depends on commons logging -->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1</version>
    </dependency>
    <!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
    <dependency>
      <groupId>javax.transaction</groupId>
      <artifactId>jta</artifactId>
      <version>1.1</version>
      <scope>runtime</scope>
    </dependency>

    <!-- junitx test assertions -->
    <dependency>
        <groupId>junit-addons</groupId>
        <artifactId>junit-addons</artifactId>
        <version>1.4</version>
        <scope>test</scope>
    </dependency>

    <!-- junit dependency; FIXME: make this a separate POM -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.1</version>
    </dependency>

  </dependencies>
  <dependencyManagement>
  </dependencyManagement>
</project>

উত্তর:


244

প্রকৃতপক্ষে, আমি মনে করি যে আপনি উল্লিখিত প্রশ্নে দেওয়া উত্তরটি কেবল ভুল ( আপডেট - 20101106: কেউ এটি স্থির করেছেন, এই উত্তরটি সম্পাদনার পূর্ববর্তী সংস্করণকে বোঝায় ) এবং এটি ব্যাখ্যা করে, অন্তত আংশিকভাবে, আপনি কেন সমস্যায় পড়েন।


এটি লগম্যানেজার / টার্গেটে দুটি জার ফাইল উত্পন্ন করে: লগম্যানেজার -১.০.০.জার, এবং লগম্যানেজার -১.০.০-জার-নির্ভরতা সহকারে.জার।

প্রথমটি হ'ল লগম্যানের মডিউলটির জেআর যা packageপর্যায়কালে তৈরি হয়েছিল jar:jar(কারণ মডিউলটির প্যাকেজিং টাইপ থাকে jar)। দ্বিতীয়টি হ'ল সমাবেশটি হ'ল assembly:assemblyবর্তমান মডিউল এবং এর নির্ভরতা (যদি আপনি বর্ণনাকারী ব্যবহার করেন jar-with-dependencies) থেকে ক্লাসগুলি থাকা উচিত ।

আমি প্রথম জারে ডাবল ক্লিক করলে আমি একটি ত্রুটি পেয়েছি:

Could not find the main class: com.gorkwobble.logmanager.LogManager. Program will exit.

আপনি যদি রেফারেন্স হিসাবে পোস্ট করা লিঙ্কটির প্রস্তাবিত কনফিগারেশন প্রয়োগ করে থাকেন তবে আপনি কার্যনির্বাহী শৈল্পিক উত্পাদন করতে জার প্লাগইনটি কনফিগার করেছেন, এরকম কিছু:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
      <archive>
        <manifest>
          <addClasspath>true</addClasspath>
          <mainClass>com.gorkwobble.logmanager.LogManager</mainClass>
        </manifest>
      </archive>
    </configuration>
  </plugin>

সুতরাং logmanager-0.1.0.jarপ্রকৃতপক্ষে কার্যকরযোগ্য তবে ১. এটি যা আপনি চান তা নয় (কারণ এটির সমস্ত নির্ভরতা নেই) এবং ২ এটি এতে থাকে না com.gorkwobble.logmanager.LogManager(এটি ত্রুটিটি কী বলছে, জারের সামগ্রীটি পরীক্ষা করুন)।

আমি যখন নির্ভরতা সহ জারের সাথে ডাবল ক্লিক করি তখন কিছুটা ভিন্ন ত্রুটি:

Failed to load Main-Class manifest attribute from: C:\EclipseProjects\logmanager\target\logmanager-0.1.0-jar-with-dependencies.jar

আবার আপনি যদি পরামর্শ মতো অ্যাসেম্বলি প্লাগইনটি কনফিগার করেন তবে আপনার কাছে এরকম কিছু রয়েছে:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
    </configuration>
  </plugin>

এই সেটআপ দিয়ে, logmanager-0.1.0-jar-with-dependencies.jarবর্তমান মডিউল থেকে ক্লাস রয়েছে এবং তার নির্ভরতা কিন্তু, ত্রুটি অনুযায়ী, তার META-INF/MANIFEST.MF নেই একটি ধারণ Main-Class(logmanager-0.1.0.jar হিসেবে তার সম্ভবত একই MANIFEST.MF) এন্ট্রি। জারটি আসলে কার্যকর করা যায় না , যা আবার আপনি চান তা নয়।


সুতরাং, আমার পরামর্শটি configurationহ'ল ম্যাভেন-জার-প্লাগইন থেকে উপাদানটি সরিয়ে ফেলা এবং মাভেন-এসেম্বলি-প্লাগইনটি এটির মতো কনফিগার করা:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.2</version>
    <!-- nothing here -->
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-4</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>
      <archive>
        <manifest>
          <mainClass>org.sample.App</mainClass>
        </manifest>
      </archive>
    </configuration>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>single</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

অবশ্যই, org.sample.Appআপনি কার্যকর করাতে চান শ্রেণীর সাথে প্রতিস্থাপন । ছোট বোনাস, আমি assembly:singleএই packageপর্যায়ে আবদ্ধ হয়েছি যাতে আপনাকে assembly:assemblyআর দৌড়াতে হবে না। কেবল রান করুন mvn installএবং স্ট্যান্ডার্ড বিল্ড চলাকালীন সমাবেশটি তৈরি করা হবে।

সুতরাং, দয়া করে উপরে বর্ণিত কনফিগারেশন সহ আপনার pom.xML আপডেট করুন এবং রান করুন mvn clean install। তারপরে, targetডিরেক্টরিতে সিডি করুন এবং আবার চেষ্টা করুন:

java -jar logmanager-0.1.0-jar-with-dependencies.jar

যদি আপনি কোনও ত্রুটি পান তবে দয়া করে আপনার প্রশ্নটি আপডেট META-INF/MANIFEST.MFকরুন এবং ফাইলটির সামগ্রী এবং আপনার pom.xml(প্লাগইন কনফিগারেশন অংশ) সম্পর্কিত অংশটি পোস্ট করুন । এছাড়াও এর ফলাফল পোস্ট করুন:

java -cp logmanager-0.1.0-jar-with-dependencies.jar com.gorkwobble.logmanager.LogManager

কমান্ড লাইনে এটি সূক্ষ্মভাবে কাজ করছে তা প্রদর্শনের জন্য (গ্রহন কী বলছে তা নির্বিশেষে)।

সম্পাদনা: জাভা 6 এর জন্য আপনাকে মেভেন-কম্পাইলার-প্লাগইনটি কনফিগার করতে হবে। এটি আপনার pom.xML এ যুক্ত করুন:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.6</source>
      <target>1.6</target>
    </configuration>
  </plugin>

4
তোমার মন্তব্যের জন্য ধন্যবাদ! আপনার নির্দিষ্ট হিসাবে আমি আমার pom.xML পরিবর্তন করেছি। আমি যখন এমভিএন ক্লিন ইনস্টল চালাই, তখন আমি আমার কোড থেকে সংকলন ত্রুটিগুলির একগুচ্ছ পাই, যে টীকাগুলি এবং এগুলি -S Source 1.3-তে সমর্থিত নয়। আমি jdk1.6 ব্যবহার করছি এবং এটি গ্রহনে সংকলিত হয়; আমি নিশ্চিত না যে 1.3 কীভাবে পরিচয় হয়েছিল। পম স্নিপেটের লাইব্রেরি সংস্করণগুলির মধ্যে একটি পুরানো?
আরএমরিসি

ধন্যবাদ! আমি 1.3 ইস্যুটি পেরিয়েছি। আমি আমার পিওএম এ জুনিট 4 নির্ভরতা যুক্ত করতে হয়েছিল। আমি অন্যান্য জিনিস সমস্যার সমাধানে কাজ করছি; আটকে গেলে আমি আবার পোস্ট করব! আমি যদি জারের চালা পেয়ে যাই তবে আমি এটি উত্তর হিসাবে চিহ্নিত করব। আমার বর্তমান পিওএম উপরের প্রশ্নে আপডেট হয়েছে।
RMorrisey

উত্পন্ন জার ফাইল থেকে সংস্থানগুলি বাদ দেওয়ার কোনও উপায় আছে কি?

2
ফলস পাত্রটির "স্বাভাবিক" নাম রাখা কি সম্ভব?
ড্যানিল শেভলেভ

1
আমি এই সোনাইটাইপ ব্লগ পোস্টটি দরকারী হিসাবেও পেয়েছি

15

পাস্কাল থিভেন্টের উত্তর আমাকেও সাহায্য করেছিল। তবে আপনি যদি আপনার প্লাগইনগুলিকে <pluginManagement>উপাদানটির মধ্যে পরিচালনা করেন , আপনাকে প্লাগইন পরিচালনার বাইরে আবার অ্যাসেমব্লিকে সংজ্ঞায়িত করতে হবে, অন্যথায় যদি আপনি চালনা করেন তবে নির্ভরতাগুলি জারে প্যাক করা হয় না mvn install

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>


    <build>
        <pluginManagement>
            <plugins>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.4</version>
                    <configuration>
                        <archive>
                            <manifest>
                                <mainClass>main.App</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>

            </plugins>

        </pluginManagement>

        <plugins> <!-- did NOT work without this  -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
            </plugin>
        </plugins>

    </build>


    <dependencies>
       <!--  dependencies commented out to shorten example -->
    </dependencies>

</project>

1
ধন্যবাদ মাইক, এটি আমাকে সাহায্য করেছে। প্রথমদিকে আমার প্যাকেজটি <প্লাগইন ম্যানেজমেন্ট> ব্যবহার না করে উত্পন্ন হচ্ছিল। তবে গ্রহনটি পম.এক্সএমএল "মাভেন - প্লাগইন সম্পাদনকে জীবনচক্র দ্বারা আচ্ছাদিত নয়" এ কিছু ত্রুটি দিচ্ছিল। যা আমাকে বিরক্ত করে। সুতরাং এটির সমাধানের জন্য আমি <প্লাগইন ম্যানেজমেন্ট> যুক্ত করেছি, এখন গ্রহনের ত্রুটি চলে গেছে তবে আমার প্যাকেজটি তৈরি হওয়া বন্ধ হয়ে গেছে। আপনার পামের উপরের স্নিপেটটি আমার পক্ষে কাজ করেছে। :)
শশাডেনোভো

2
এটি দরকারী ছিল .. <pluginManagement> ব্যবহার করার সময়, শীর্ষ উত্তরটি কাজ করবে না।
ininprsr

5

আপনি যদি প্যাকেজে অ্যাসেমব্লিক গোলটি কার্যকর করতে না চান তবে আপনি পরবর্তী আদেশটি ব্যবহার করতে পারেন:

mvn package assembly:single

এখানে প্যাকেজটি কীওয়ার্ড।


-1

প্রকল্পটিতে ডান ক্লিক করুন এবং মাভেন বিল্ড, মাভেন ক্লিন, ম্যাভেন জেনারেট উত্পন্ন উত্স এবং মাভেন ইনস্টল দিন j জার ফাইলটি স্বয়ংক্রিয়ভাবে উত্পন্ন হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.