মাভেন: আপেক্ষিক পথে কোনও জারে নির্ভরতা যুক্ত করুন


232

আমার একটি মালিকানার জার রয়েছে যা আমি আমার পোমে নির্ভরতা হিসাবে যুক্ত করতে চাই।

তবে আমি এটি কোনও ভাণ্ডারে যুক্ত করতে চাই না। কারণটি হ'ল আমি চাইছি আমার সাধারণ মভেন কমান্ডগুলি যেমন mvn compile, ইত্যাদি, বাক্সটির বাইরে কাজ করা। (বিকাশকারীদের কাছে এটিকে নিজের দ্বারা কিছু ভাণ্ডারে যুক্ত করার দাবি না করে)।

আমি চাই যে জারটি সোর্স কন্ট্রোলের তৃতীয় পক্ষের লিবিতে থাকুক এবং এর সাথে pom.xML ফাইলটি থেকে আপেক্ষিক পথে লিঙ্ক করব।

এই কাজ করা যাবে? কিভাবে?

উত্তর:


343

আমি চাই যে জারটি সোর্স কন্ট্রোলের তৃতীয় পক্ষের লিবিতে থাকুক এবং এর সাথে pom.xML ফাইলটি থেকে আপেক্ষিক পথে লিঙ্ক করব।

আপনি যদি সত্যিই এটি চান (বুঝতে পারেন, যদি আপনি কর্পোরেট ভাণ্ডার ব্যবহার করতে না পারেন), তবে আমার পরামর্শটি হবে প্রকল্পের জন্য স্থানীয় একটি "ফাইলের সংগ্রহস্থল" ব্যবহার করা এবং কোনও systemস্কোপড নির্ভরতা না ব্যবহার করা । systemবিশ্লেষণ করা এড়িয়ে চলা উচিত, এই ধরনের নির্ভরতা অনেক পরিস্থিতি ভাল কাজ করে না (যেমন সমাবেশ মধ্যে), তারা সুবিধা চেয়ে বেশি যন্ত্রণার হতে পারে।

সুতরাং, পরিবর্তে, প্রকল্পের জন্য একটি স্থানীয় সংগ্রহস্থল ঘোষণা করুন:

<repositories>
  <repository>
    <id>my-local-repo</id>
    <url>file://${project.basedir}/my-repo</url>
  </repository>
</repositories>

সেখানে ব্যবহার করে আপনার তৃতীয় পক্ষের liberal এর সংক্ষিপ্ত রূপ ইনস্টল install:install-fileসঙ্গে localRepositoryPathপরামিতি:

mvn install:install-file -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
                         -DartifactId=<myArtifactId> -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>

আপডেট: এটি প্রদর্শিত হয় যে প্লাগইনটির ২.২ সংস্করণ ব্যবহার করার সময় তা install:install-fileউপেক্ষা করে localRepositoryPath। তবে এটি প্লাগইনের ২.৩ সংস্করণ এবং তারপরে কাজ করে। সুতরাং সংস্করণটি নির্দিষ্ট করতে প্লাগইনের সম্পূর্ণরূপে যোগ্যতাসম্পন্ন নামটি ব্যবহার করুন:

mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file \
                         -Dfile=<path-to-file> -DgroupId=<myGroup> \ 
                         -DartifactId=<myArtifactId> -Dversion=<myVersion> \
                         -Dpackaging=<myPackaging> -DlocalRepositoryPath=<path>

maven-ইনস্টল-প্লাগইন ডকুমেন্টেশন

শেষ অবধি, এটি অন্যান্য নির্ভরতার মতো ঘোষণা করুন (তবে systemসুযোগটি ছাড়াই ):

<dependency>
  <groupId>your.group.id</groupId>
  <artifactId>3rdparty</artifactId>
  <version>X.Y.Z</version>
</dependency>

এই systemসুযোগটি ব্যবহার করার চেয়ে এটি আইএমএইচওর আরও ভাল সমাধান কারণ আপনার নির্ভরতা একজন ভাল নাগরিকের মতো বিবেচিত হবে (যেমন এটি কোনও সমাবেশে অন্তর্ভুক্ত করা হবে ইত্যাদি)।

এখন, আমাকে উল্লেখ করতে হবে যে কর্পোরেট পরিবেশে এই পরিস্থিতি মোকাবেলার "সঠিক উপায়" (সম্ভবত এখানে নয়) একটি কর্পোরেট সংগ্রহস্থল ব্যবহার করা হবে।


2
এটি দুর্দান্ত ধারণা, তবে ম্যাভেন ২.২.১-তে, ইনস্টল প্লাগইনটি এড়ানো হচ্ছে বলে মনে হচ্ছে localRepositoryPath...
জেক ২

1
স্থানীয় রেপো ঘোষনা কেন? বাকিদের সাথে কেন এটি কেবল ~ / .m2 / এ যেতে দেয় না।
লাইফ গ্রুইনওয়েল্ট

6
@ leif81 কারণ তখন রেপো এবং গ্রন্থাগারগুলি এসসিএম সংগ্রহস্থলে চেক করা হয় -> যে কেউ সোর্স চেকআউট করে তাদের লাইব্রেরি / অ্যাপ্লিকেশনটির একটি অনুলিপি তৈরি করার জন্য প্রয়োজনীয় সমস্ত কিছু রয়েছে।
ডারথ অ্যান্ড্রয়েড

6
আমি @ লেমন হিসাবে একই সমস্যা ছিল, আমি পরিবর্তে basedir/./my-local-repoএকটি একক দিয়ে এটি স্থির করে যা .
ব্রায়ান

2
প্যাকেজিং জার হতে হবে, অতএব
ড্যানিলা পিয়াতভ

127

systemসুযোগ ব্যবহার করে । ${basedir}আপনার পম ডিরেক্টরি

<dependency>
    <artifactId>..</artifactId>
    <groupId>..</groupId>
    <scope>system</scope>
    <systemPath>${basedir}/lib/dependency.jar</systemPath>
</dependency>

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


15
স্কপ সিস্টেমটি যেখানেই সম্ভব এটি এড়ানো উচিত। সংগ্রহস্থলটিতে
জেআর

14
হ্যাঁ, সম্ভব হলে তিনি স্পষ্টতই বলেছিলেন যে তিনি এটি সংগ্রহস্থলে রাখতে চান না। আমি একটি মন্তব্য যুক্ত করে উল্লেখ করেছিলাম যে এটি একটি ভাল অনুশীলন নয়। কিন্তু এটি কাজ করে।
বোঝো

গ্রোভি, আপনার সমাধান এখন পর্যন্ত সর্বাধিক গ্রহণযোগ্য .. আমি সম্পূর্ণরূপে প্রশ্নটি ভুলভাবে লিখেছি
পিঁপড়া

হ্যাঁ - প্রশ্নটি সেরা উত্তর বাদ দেয়। আপনার একক উত্স নিয়ন্ত্রণ সার্ভারে সমস্ত কিছু রাখার সাথে "বাক্সটি তৈরি করার" সাথে খুব একটা সম্পর্ক নেই; পরিবর্তে, সমস্ত কিছু কেবল "নিয়ন্ত্রিত" হতে হবে। পোমের & সেটিংস.এক্সএমএল পরীক্ষা করুন ( অভ্যন্তরীণ রেপোকে নির্দেশ করছে ) এবং আপনার প্রকল্পের জন্য দুটি সার্ভার ব্যবহার করুন: (১) উত্স নিয়ন্ত্রণ, (২) উত্পন্ন আর্টিক্ট নিয়ন্ত্রণ। এটি জারগুলিতে যতটা বুদ্ধিমান চেক করে তোলে ঠিক ততটাই বুদ্ধিমান করে তোলে (আমার পুরানো কর্পস আসলে জারগুলি & lib.a / .so / .dll এর চেক ইন করেছিল Our -দু-দিনের কাজ। সমস্যা সমাধান?
মাইকেল

পরিবর্তে জারগুলি রয়েছে এমন একটি ডিরেক্টরি নির্দিষ্ট করার কোনও উপায় যাতে আমরা গ্রেডের মতো প্রতিটি একে একে যুক্ত করতে না পারি?
ডিন হিলার 4'13

29

আমার আগের উত্তর ছাড়াও এটি অন্য পদ্ধতি যা আমি কি জালগুলি মেশিন 2-এ ইনস্টল না করে ক্লাসপাথ তৈরি করতে পারি?

মাল্টি-মডিউল বিল্ডগুলি ব্যবহার করার সময় এটি সীমাটি পেয়ে যাবে বিশেষত যদি ডাউনলোড করা জেআর পিতামাতার বাইরে শিশু প্রকল্পগুলিতে উল্লেখ থাকে। এটি বিল্ডের অংশ হিসাবে POM এবং SHA1 ফাইল তৈরি করে সেটআপ কাজ হ্রাস করে। এটি ফাইলগুলি নামগুলি স্থির না করে বা মভেন সংগ্রহস্থল কাঠামো অনুসরণ না করেই প্রকল্পের যে কোনও জায়গায় বাস করতে দেয়।

এটি মেভেন-ইনস্টল-প্লাগইন ব্যবহার করে। এটি কাজ করার জন্য, আপনার একাধিক-মডিউল প্রকল্প স্থাপন করতে হবে এবং স্থানীয় সংগ্রহস্থলগুলিতে ফাইলগুলি ইনস্টল করার জন্য বিল্ডের প্রতিনিধিত্ব করে একটি নতুন প্রকল্প স্থাপন করা উচিত এবং এটি নিশ্চিত যে এটি প্রথম is

আপনি বহু-মডিউল প্রজেক্ট pom.xML দেখতে পাবেন:

<packaging>pom</packaging>
<modules>
<!-- The repository module must be first in order to ensure
     that the local repository is populated -->
    <module>repository</module>
    <module>... other modules ...</module>
</modules>

সংগ্রহস্থল / pom.xML ফাইলটিতে আপনার প্রকল্পের অংশ জেআরগুলি লোড করার সংজ্ঞা থাকবে। নীচে pom.xML ফাইলের কিছু স্নিপেট রয়েছে।

<artifactId>repository</artifactId>
<packaging>pom</packaging>

পম প্যাকেজিং এটিকে কোনও পরীক্ষা করে বা সংকলন করতে বা কোনও জার ফাইল তৈরি করতে বাধা দেয়। Pom.xML এর মাংসটি বিল্ড বিভাগে থাকে যেখানে maven-ইনস্টল-প্লাগইন ব্যবহৃত হয়।

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-install-plugin</artifactId>
            <executions>
                <execution>
                        <id>com.ibm.db2:db2jcc</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>install-file</goal>
                        </goals>
                        <configuration>
                            <groupId>com.ibm.db2</groupId>
                            <artifactId>db2jcc</artifactId>
                            <version>9.0.0</version>
                            <packaging>jar</packaging>
                            <file>${basedir}/src/jars/db2jcc.jar</file>
                            <createChecksum>true</createChecksum>
                            <generatePom>true</generatePom>
                        </configuration>
                </execution>
                <execution>...</execution>
            </executions>
        </plugin>
    </plugins>
</build>

একাধিক ফাইল ইনস্টল করতে, কেবলমাত্র আরও কার্যকর করা যুক্ত করুন।


এটিই আমার মাল্টি-মডিউল প্রকল্পের জন্য কাজ করেছে। অজানা কারণে স্থানীয় <repository> পদ্ধতির কাজ হয়নি। সূতরাং ধন্যবাদ!
লোনজাক

10

এটি আমার পক্ষে কাজ করছে: ধরা যাক আমার এই নির্ভরতা রয়েছে

<dependency>
    <groupId>com.company.app</groupId>
    <artifactId>my-library</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/lib/my-library.jar</systemPath>
</dependency>

তারপরে, নিজের সিস্টেমে নির্ভরতার জন্য ক্লাস-পাথটি ম্যানুয়ালি যুক্ত করুন

<Class-Path>libs/my-library-1.0.jar</Class-Path>

সম্পূর্ণ কনফিগারেশন:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <archive>
            <manifestEntries>
                <Build-Jdk>${jdk.version}</Build-Jdk>
                <Implementation-Title>${project.name}</Implementation-Title>
                <Implementation-Version>${project.version}</Implementation-Version>
                <Specification-Title>${project.name} Library</Specification-Title>
                <Specification-Version>${project.version}</Specification-Version>
                <Class-Path>libs/my-library-1.0.jar</Class-Path>
            </manifestEntries>
            <manifest>
                <addClasspath>true</addClasspath>
                <mainClass>com.company.app.MainClass</mainClass>
                <classpathPrefix>libs/</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}/libs/</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

9

আমি আগে এটি করার জন্য একটি প্যাটার্ন সম্পর্কে লিখেছি

এটি পাস্কেলের প্রস্তাবিত সমাধানের সাথে খুব মিল, যদিও এটি এমন সমস্ত নির্ভরতা একটি উত্সর্গীকৃত সংগ্রহস্থল মডিউলে স্থানান্তরিত করে যাতে আপনাকে এটি সর্বত্র পুনরাবৃত্তি করতে হবে না যদি এটি মাল্টি-মডিউল বিল্ড হয় তবে নির্ভরতা ব্যবহৃত হয়।


6

মূলত, এটি pom.xml এ যুক্ত করুন:

...

<repositories>
   <repository>
       <id>lib_id</id>
       <url>file://${project.basedir}/lib</url>
   </repository>
</repositories>

...

<dependencies>
  ...
  <dependency>
      <groupId>com.mylibrary</groupId>
      <artifactId>mylibraryname</artifactId>
      <version>1.0.0</version>
  </dependency>
  ...
</dependencies>

4

আমরা গ্রেডে স্যুইচ করেছি এবং এটি গ্রেডে আরও ভাল কাজ করে;)। আমরা কেবলমাত্র এমন একটি ফোল্ডার নির্দিষ্ট করি যা আমরা অস্থায়ী পরিস্থিতিতে জারগুলিতে ফেলে দিতে পারি। আমরা এখনও আমাদের বেশিরভাগ জারগুলি টাইপিক্যালি নির্ভরতা পরিচালন বিভাগের (যেমন: ম্যাভেনের মতো) সংজ্ঞায়িত করেছি। এটি আমরা আরও একটি নির্ভরতা নির্ধারণ করি।

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


1
আপনি কীভাবে একটি উদাহরণ দিতে পারেন?
থমাস

2

পাস্কেল পোস্ট করা সমাধানে একটি ছোট সংযোজন

আমি যখন এই রুটটি অনুসরণ করেছি তখন ওজেডবিসি জারটি ইনস্টল করার সময় আমি মাভেনে একটি ত্রুটি পেয়েছি।

[INFO] --- maven-install-plugin:2.5.1:install-file (default-cli) @ validator ---
[INFO] pom.xml not found in ojdbc14.jar

-ডম্পম ফাইল যোগ করার পরে, সমস্যাটি সমাধান করা হয়েছিল।

$ mvn install:install-file -Dfile=./lib/ojdbc14.jar -DgroupId=ojdbc \
   -DartifactId=ojdbc -Dversion=14 -Dpackaging=jar -DlocalRepositoryPath=./repo \
   -DpomFile=~/.m2/repository/ojdbc/ojdbc/14/ojdbc-14.pom

0

আপনি চলমানযোগ্য জার তৈরি করতে এক্সলিপ ব্যবহার করতে পারেন: রফতানি / চলমান জার ফাইলটি


নিশ্চিত নয় যে এটি প্রশ্নের উত্তর দিচ্ছে। তার কাছে ইতিমধ্যে জার হিসাবে ফাইল রয়েছে।
জোহানেস জেন্ডার

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