আমি মাভেনের সাথে চূড়ান্ত জেআর ফাইলের ভিতরে কোনও লাইব্রেরী ফোল্ডারে সমস্ত প্রয়োজনীয় জেআর ফাইলগুলি কীভাবে রাখব?


104

আমি আমার স্বতন্ত্র অ্যাপ্লিকেশনটিতে মাভেন ব্যবহার করছি, এবং আমি এখানে উত্তরগুলির একটিতে উল্লিখিত হিসাবে আমার জেআর ফাইলের সমস্ত নির্ভরতা একটি লাইব্রেরি ফোল্ডারের ভিতরে প্যাকেজ করতে চাই:

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

আমি চাই আমার চূড়ান্ত জেআর ফাইলটিতে একটি লাইব্রেরি ফোল্ডার রয়েছে যা জেআর ফাইল হিসাবে নির্ভরতা ধারণ করে, maven-shade-pluginএটি এমএম 2 ফোল্ডারে মাভেন হায়ারার্কির মতো ফোল্ডারের আকারে নির্ভরতাগুলি কী রাখে তা পছন্দ করে না।

ঠিক আছে, আসলে বর্তমান কনফিগারেশনটি আমি যা চাই তা করি তবে অ্যাপ্লিকেশনটি চালানোর সময় জেআর ফাইলগুলি লোড করার ক্ষেত্রে আমার একটি সমস্যা হচ্ছে। আমি ক্লাস লোড করতে পারি না।

এখানে আমার কনফিগারেশন:

<plugins>

    <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}/classes/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>com.myapp.MainClass</mainClass>
                </manifest>
            </archive>
        </configuration>
    </plugin>

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

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <executions>
            <execution>
                <id>install</id>
                <phase>install</phase>
                <goals>
                    <goal>sources</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.5</version>
        <configuration>
            <encoding>UTF-8</encoding>
        </configuration>
    </plugin>

</plugins>

প্রকল্পটি Eclipse থেকে সূক্ষ্মভাবে চলে এবং জার ফাইলগুলি আমার চূড়ান্ত জেআর ফাইলের ভিতরে লাইব্রেরী ফোল্ডারে আমার পছন্দ হিসাবে রাখা হয়, তবে লক্ষ্য ফোল্ডার থেকে চূড়ান্ত জেআর ফাইল চালানোর সময় আমি সর্বদা পেতে পারি ClassNotFoundException:

Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.myapp.MainClass. Program will exit.

আমি কীভাবে এই ব্যতিক্রমটি ঠিক করতে পারি?


1
জার চালাতে আপনি কোন আদেশ ব্যবহার করেন? সম্ভবত আপনি ম্যাভেন এক্স প্লাগইন পছন্দ করতে পারেন?
অ্যান্ড্রে বরিসভ

ব্যতিক্রম বার্তা কি পিওএম ফাইলের সাথে তুলনা করে? দেখে মনে com.myapp.MainClassহচ্ছে মূল শ্রেণীর সন্ধান করা হচ্ছে, নয় com.tastycafe.MainClass
ডানকান জোন্স

@ ডানকান জোন্স, কপি পেস্ট সমস্যা, আমি প্রশ্নটি সম্পাদনা করেছি
মাহমুদ সালেহ

3
নোট করুন যে আপনি যদি জারের অভ্যন্তরে জারগুলি চান, তবে জাভার মানক শ্রেণিবদ্ধরা তাদের বুঝতে পারবেন না।
থরবজর্ন রাভন অ্যান্ডারসন

কীভাবে এটি জিবের বাইরে কিন্তু একটি lib ফোল্ডারে maven নির্ভরতা রাখে?
এডি 22

উত্তর:


81

নিম্নলিখিত আমার সমাধান। এটি যদি আপনার পক্ষে কাজ করে তবে এটি পরীক্ষা করুন:

<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}/classes/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>test.org.Cliente</mainClass> -->
            </manifest>
            <manifestEntries>
                <Class-Path>lib/</Class-Path>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

প্রথম প্লাগইন লক্ষ্য / শ্রেণি / lib ফোল্ডারে সমস্ত নির্ভরতা রাখে এবং দ্বিতীয়টি চূড়ান্ত জেআর ফাইলটিতে লাইব্রেরি ফোল্ডার অন্তর্ভুক্ত করে এবং Manifest.mfফাইলটি কনফিগার করে ।

তবে তারপরে জেআর ফাইলগুলি লোড করার জন্য আপনাকে কাস্টম শ্রেণিবদ্ধকরণ কোড যুক্ত করতে হবে।

অথবা, কাস্টম ক্লাসলোডিং এড়ানোর জন্য, আপনি "{{प्रोजेक्ट.বিল্ড.ডাইরেক্টরি} / lib ব্যবহার করতে পারেন, তবে এই ক্ষেত্রে আপনার চূড়ান্ত জেআর ফাইলের মধ্যে নির্ভরতা নেই, যা উদ্দেশ্যকে পরাস্ত করে।

প্রশ্নটি জিজ্ঞাসা করার পরে দু'বছর হয়ে গেছে। নেস্টেড জেআর ফাইলগুলির সমস্যা তবুও বজায় রয়েছে। আমি আশা করি এটি কাউকে সাহায্য করবে


1
ব্যবহার: এমভিএন ইনস্টল, সিডি লক্ষ্য, জাভা -জার মাইজারফিল -১.০.জার
ডিজেবি

আমি কি মিস করি? এটি lib ফোল্ডার থেকে "lib /" এবং সমস্ত একক জার সমন্বিত ম্যানিফেস্টের ক্লাসপথ এন্ট্রি তৈরি করে। এটা কি উদ্দেশ্য? কেন?
ফাঁকদৃষ্টি

2
আমি "$ {प्रोजेक्ट.ইবিল্ড.ডাইরেক্টরি} / ক্লাসস / লিবিব" কে $ {প্রজেক্ট.বিল্ড.ডাইরেক্টরি li / লিবিতে পরিবর্তন করার পরে এটি কাজ করেছিল
রাজেন্দ্র থোরাট

1
দুর্ভাগ্যজনকভাবে সরবরাহ হিসাবে ঘোষিত নির্ভরতা অন্তর্ভুক্ত করে।
ফিলিপ জিওসিফি

@ রাজেন্দ্র ধন্যবাদ, যে সাহায্য করেছে: $ {प्रोजेक्ट.বিল্ড.ডাইরেক্টরি} / লিবি
মিন্দোগাস কে।

30

আপডেট করা হয়েছে:

<build> 
  <plugins> 
    <plugin> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
      <execution> 
        <phase>install</phase> 
          <goals> 
            <goal>copy-dependencies</goal> 
          </goals> 
          <configuration> 
             <outputDirectory>${project.build.directory}/lib</outputDirectory> 
          </configuration> 
        </execution> 
      </executions> 
    </plugin> 
  </plugins> 
</build> 

4
এটি লিব ফোল্ডারটিকে জারের বাইরে রাখে (যা আমি চাই তা নয়)। পাত্রটি জারের ভিতরে রাখার চেয়ে ভাল? এবং এই ক্ষেত্রে ক্লায়েন্টের কাছে কীভাবে অ্যাপ্লিকেশন সরবরাহ করবেন?
মাহমুদ সালেহ

এটা এখন আমার জন্য আরও স্পষ্ট। আমাকে একটি গুগল অনুসন্ধান করতে দিন তবে আমি জানতে চাই কেন আপনি নির্বাহযোগ্য জার ফাইলের মধ্যে নির্দিষ্ট ফোল্ডারে সমস্ত নির্ভরতা জার ফাইলটি অনুলিপি করতে চান। সমস্ত নির্ভরতা জার ফাইলগুলি যদি জার ফাইলের মধ্যে থাকে তবে আপনার সেগুলি কেন একটি লিবিব ফোল্ডারে সনাক্ত করার প্রয়োজন?
আহমেট কারাকায়া

23

সবচেয়ে সহজ এবং সবচেয়ে কার্যকর উপায় হ'ল এর মতো একটি উবার প্লাগইন ব্যবহার করা:

          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <finalName>uber-${artifactId}-${version}</finalName>
            </configuration>
        </plugin>

আপনি একটি জেআর ফাইলে সমস্ত ডি-সাধারণ করেছেন।


আমার বর্তমান কনফিগারেশন ছাড়াও এটি ব্যবহার করবেন? এবং এই প্লাগইন ঠিক কি করে?
মাহমুদ সালেহ

15
আমি চাই না যে আমার জার ফাইলটি এর মতো দেখতে পাবে, আমি জার ফাইলের অভ্যন্তরে একটি lib ফোল্ডারের সমস্ত নির্ভরতা নেটবিনের মতো করতে চাই।
মাহমুদ সালেহ

12

এক্সিকিউটেবল প্যাকার ম্যাভেন প্লাগইন ঠিক উদ্দেশ্যে ব্যবহার করা যেতে পারে: স্বতন্ত্র জাভা একটি নির্দিষ্ট ফোল্ডারে JAR- র ফাইল হিসেবে সব নির্ভরতা ধারণকারী অ্যাপ্লিকেশন তৈরি করা।

কেবলমাত্র আপনার বিভাগের pom.xmlভিতরে নিম্নলিখিতটি যুক্ত করুন <build><plugins>( mainClassসেই অনুযায়ী মানটি প্রতিস্থাপন করতে ভুলবেন না ):

<plugin>
    <groupId>de.ntcomputer</groupId>
    <artifactId>executable-packer-maven-plugin</artifactId>
    <version>1.0.1</version>
    <configuration>
        <mainClass>com.example.MyMainClass</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>pack-executable-jar</goal>
            </goals>
        </execution>
    </executions>
</plugin>

target/<YourProjectAndVersion>-pkg.jarআপনার চালনার পরে তৈরি জার ফাইলটি অবস্থিত mvn package। এর সমস্ত সংকলন-সময় এবং রানটাইম নির্ভরতা lib/জেআর ফাইলের অভ্যন্তরে ফোল্ডারে অন্তর্ভুক্ত করা হবে।

দাবি অস্বীকার: আমি প্লাগইনটির লেখক।


আমি এটি চেষ্টা করেছিলাম এবং আমি বলতে পারি এটি কাজ করছে ... যেমন আপনি বলেছিলেন, এই প্লাগইনটি একটি জার ফাইল তৈরি করে, এর লাইব্রেরিগুলি (জারস) দিয়ে জারের একটি লাইব ডিরেক্টরিতে ... কনফিগারেশনটি সত্যিই সহজ .. আমার মনে হয় এটি কি এই প্রশ্নের লেখক প্রত্যাশা করছেন ... আমি আপনাকে আমার ভোট দিয়ে দেব ... আমি এটির মধ্যে কেবলমাত্র একটি অপূর্ণতা পেয়েছি (এ কারণেই আমি এটি ব্যবহার করতে পারিনি), আমি যখন আমার মৃত্যুদণ্ড কার্যকর করি তখন দেরি হয় জার এবং অ্যাপ্লিকেশনটি দেখানো হয়েছে (প্রায় 20 সেকেন্ড) কাস্টম ক্লাস লোডারে libs নিবন্ধনের প্রক্রিয়াটির কারণে ... তবে এটি দুর্দান্ত পদ্ধতির এবং একটি দুর্দান্ত প্লাগইন ...
অ্যাডাম এম গ্যাম্বোয়া জি

5

এই লিঙ্ক অনুসরণ:

কীভাবে: নির্ভরতা সহ গ্রহন মাভেন বিল্ড জারটি ইনস্টল করুন

আমি খুঁজে পেয়েছি যে এটি কার্যক্ষম সমাধান নয় কারণ শ্রেণি লোডার জারের মধ্যে থেকে জারগুলি লোড করে না, তাই আমি মনে করি যে আমি জারের অভ্যন্তরের নির্ভরতাগুলি আনপ্যাক করব।


3

আমি এটি কীভাবে করছি তা এখানে:

    <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>2.2</version>
            <configuration>
                <appendAssemblyId>false</appendAssemblyId>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <archive>
                    <manifest>
                        <mainClass>com.project.MainClass</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

এবং তারপরে আমি কেবল চালাই:

mvn assembly:assembly

1
নোট করুন যে আপনার হাতের আগে সর্বদা একটি সংকলন করা উচিত কারণ assemblyজেআর-তে "টার্গেট / ক্লাস" এ যা কিছু থাকবে কেবল তা রাখবেন। এটি নিশ্চিত করবে যে জেআর-এ সোর্স কোডে আপনি সম্প্রতি করা কোনও পরিবর্তন অন্তর্ভুক্ত করেছেন। সুতরাং, আপনার মতো কিছু করা উচিত : mvn clean compile assembly:assembly.
নেক্সা

2

আমি এই প্রশ্নের উত্তর পেয়েছি:

http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html

আপনি কেবল একটি lib ফোল্ডারে নির্ভরশীল lib ফাইলগুলি পান না, আপনি একটি ইউনিক্স এবং ডস উভয় কার্যকর করতে একটি বিন পরিচালক পান।

এক্সিকিউটেবল শেষ পর্যন্ত জাভাটিকে একটি এসিপি যুক্তি দিয়ে কল করে যা আপনার সমস্ত নির্ভরশীল লিবগুলিকেও তালিকাভুক্ত করে।

পুরো ফটোগুলি লক্ষ্য ফোল্ডারের ভিতরে একটি অ্যাপসেম্বলি ফোল্ডারে বসে। এপিক।

============= হ্যাঁ আমি জানি এটি একটি পুরানো থ্রেড, তবে এটি এখনও অনুসন্ধানের ফলাফলগুলিতে উচ্চতর হচ্ছে সুতরাং আমি ভেবেছিলাম এটি আমার মতো কাউকে সাহায্য করতে পারে।


1

এটি স্পষ্টতই একটি শ্রেণিপথ সমস্যা। আপনি যখন আইডিই এর বাইরে আপনার প্রোগ্রাম চালাবেন তখন ক্লাসপাথটি অবশ্যই কিছুটা পরিবর্তন করতে হবে তা বিবেচনায় রাখুন। কারণ আইডিই আপনার প্রকল্পের মূল ফোল্ডারের সাথে সম্পর্কিত অন্যান্য জেআর লোড করে, যখন চূড়ান্ত জারের ক্ষেত্রে এটি সাধারণত সত্য হয় না।

এই পরিস্থিতিতে আমি যা করতে চাই তা হ'ল জআআআআআআআআর ম্যানুয়ালি তৈরি করা। এটি আমার পক্ষে সর্বোচ্চ ৫ মিনিট সময় নেয় এবং এটি সর্বদা সমস্যা সমাধান করে। আমি আপনাকে এটি করার পরামর্শ দিচ্ছি না। মাভেনকে ব্যবহার করার জন্য কোনও উপায় খুঁজুন, এটিই তার উদ্দেশ্য।


@ সোবললান নিজেই জআআআআআআআআআআআআআআআআআআআর জর্মানা তৈরি করা এখানে কোনও সমাধান নয়। অভিপ্রায়টি মাভেনকে ব্যবহার করার, যা "ম্যানুয়াল" এর ঠিক বিপরীত!
ডানকান জোন্স

@ ডানকানজোনস আমি প্রস্তাব দিচ্ছি যে তিনি এটি করার জন্য ম্যাভেনকে ব্যবহার করেন। তবে এর সাথে আমার কোনও অভিজ্ঞতা নেই এবং ঠিক কী সমাধানের পরামর্শ দেওয়ার তা জানতাম না। এটি প্রতিফলিত করার জন্য আমি আমার উত্তর সম্পাদনা করেছি।
রাদু মুর্জিয়া
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.