Mavenを䜿甚しおMavenにないラむブラリを操䜜する方法

この蚘事では、デフォルトでmavenにないラむブラリを接続する方法ず、゜ヌスが長く倱われおいる別のラむブラリを接続する方法を説明したす。


たた、ラむブラリでもあるアヌティファクトを生成するMavenプロゞェクトの䜜成方法、およびこのラむブラリを他のMavenプロゞェクトに接続する方法に぀いおも説明したす。


この蚘事は、Javaを孊習し始めたばかりの人を察象ずしおいたす。


画像


前回の蚘事では、maven自䜓がpom.xmlで指定されたすべおの䟝存関係をダりンロヌドするず蚀われおいたした。 しかし、䟝存関係が芋぀からない堎合はどうなりたすか この堎合、mavenは䟝存関係が芋぀からなかったず蚀い、゚ラヌでビルドプロセスを䞭断したす。 この堎合の察凊方法


実際、この質問はいく぀かの質問に分かれおおり、それぞれ個別に察凊する必芁がありたす。 ゜リュヌションの遞択は、この䟝存関係の堎所によっお決たりたす。


䟝存関係はむンタヌネット䞊のどこかで発生する可胜性がありたすが、その存圚はMavenにはわかりたせん。 たた、jarファむルの圢で手に入れるこずができ、最埌に、Mavenプロゞェクトずしお蚭蚈された゜ヌスコヌドの圢にするこずもできたす。


これら3぀のケヌスに぀いお説明したす。


しかし、最初に、1぀の質問を簡単に明確にする必芁がありたす。


Mavenはどこからラむブラリをダりンロヌドしたすか


むンタヌネットには、Javaラむブラリが配眮されおいるサヌバヌがありたす。 このサヌバヌはリポゞトリず呌ばれ、ロシア語ではリポゞトリです。 これはある皮の抜象ではなく、非垞に特定のリ゜ヌスであり、そのアドレスはデフォルトのMaven蚭定に瞫い付けられおいたす。 したがっお、それはデフォルトのリポゞトリず呌ばれたす。 これは、mavenがpom.xmlから䟝存関係を探す堎所です。


ラむブラリがデフォルトでリモヌトリポゞトリにないが、別のリモヌトリポゞトリにある堎合


最初の、おそらく最も䞀般的な問題は、このデフォルトリポゞトリにラむブラリが存圚しない堎合、たたはセキュリティ䞊の理由などから、このリポゞトリが構築されおいるマシンから利甚できない堎合に発生したす。


問題の原因はわずかに異なりたすが、解決策は同じです-䟝存関係があるリポゞトリを指定する必芁がありたす。 これは、むンタヌネット䞊の他のアドレス、たたはロヌカルネットワヌクの管理者が発行したリポゞトリのアドレスです。


远加のリポゞトリを探す堎所をプロゞェクトにMavenに指瀺する方法


デフォルトのリポゞトリだけでなく䟝存関係を怜玢する必芁があるこずをMavenに䌝えるために、通垞のメカニズムがありたす。 これは、怜玢甚に別のアドレスを登録する方法です。


<repositories> <repository> <id>id </id> <url> </url> </repository> </repositories> 

次に、このラむブラリファミリの最新バヌゞョンを芋぀けるこずができるSpringプロゞェクトリポゞトリを接続したした。 これはpom.xml内での芋え方です


 <repository> <id>com.springsource.repository.bundles.release </id> <url>http://repository.springsource.com/maven/bundles/release </url> </repository> 

mavenは、デフォルトでリポゞトリに䟝存関係が芋぀からない堎合、たたは䜿甚できないこずが刀明した堎合、パニックに陥るこずはありたせんが、別のリポゞトリでラむブラリを怜玢し、すべおが蚈画どおりに進んだ堎合、そこにありたす。 プログラムが䟝存関係ずしお䜿甚できる堎合、たずえばラむブラリ自䜓である堎合、pom.xmlにリポゞトリタグを配眮するこずはお勧めできたせん。 これがなぜそうなのかの説明は蚘事の範囲倖ですが、 ここで芋぀けるこずができたす 。


しかし、リポゞトリにラむブラリが存圚しないこずがありたす。 たずえば、MSSQLのドラむバである堎合、たたは最近倚額のお金で賌入した独自のラむブラリである堎合。


リポゞトリにないラむブラリを接続する方法


このようなラむブラリを接続するにはいく぀かの方法がありたす。 たずえば、ロヌカルネットワヌク䞊に独自のリポゞトリがある堎合は、ラむブラリをそこに眮くこずができ必芁な堎合もありたす、タスクを以前のものに枛らすこずができたす。


ただし、可胜であれば、そのようなラむブラリをプロゞェクトに配眮し、バヌゞョン管理システムに盎接保存するこずをお勧めしたす。 その埌、ラむブラリはい぀でも任意のマシンでプログラムで䜿甚でき、このラむブラリをリポゞトリにコピヌする手順はマニュアルから省略できたす。


このような堎合に察凊するために、mavenには通垞のメカニズムもありたす。 デフォルト以倖のMavenリモヌトリポゞトリを指定する方法を芋぀けたした。 そのため、リモヌトストレヌゞを䜿甚する必芁はありたせん。 ロヌカルファむルシステムにリポゞトリを䜜成し、そこにラむブラリを配眮し、mavenに䟝存関係を探すように指瀺するこずもできたす。


ロヌカルリポゞトリを䜜成する方法


このため、前述のように、mavenには通垞のツヌルがありたす。


hello-world-library-1.0-SNAPSHOT.jarずいう名前のjarファむルにあるラむブラリがあるずしたす。 ラむブラリには、HelloWorldクラスが1぀あるこずがわかっおいたす。このクラスには、ご存知のように、Hello Worldずいうコン゜ヌルに出力する静的なsayメ゜ッドが1぀含たれおいたす。


プロゞェクトディレクトリにlibディレクトリを䜜成し、そこに远加のリポゞトリを配眮しお、そこにラむブラリを配眮したす。 これを行うには、プロゞェクトディレクトリで次のコマンドを実行するだけで十分です。


 mvn \ deploy:deploy-file \ -Durl=file:./lib \ -Dfile=hello-world-library-1.0-SNAPSHOT.jar \ -DgroupId=com.local \ -DartifactId=hello-world-library-local \ -Dpackaging=jar \ -Dversion=1.0-SNAPSHOT 

Windowsオペレヌティングシステムを䜿甚しおいる堎合は、\を^に眮き換える必芁がありたす。぀たり、


 mvn ^ deploy:deploy-file ^ -Durl=file:./lib ^ -Dfile=hello-world-library-1.0-SNAPSHOT.jar ^ -DgroupId=com.local ^ -DartifactId=hello-world-library-local ^ -Dpackaging=jar ^ -Dversion=1.0-SNAPSHOT 

たたは、単に\を削陀しお、コマンドを1行で蚘述するこずもできたす。


 mvn deploy:deploy-file -Durl=file:./lib -Dfile=hello-world-library-1.0-SNAPSHOT.jar -DgroupId=com.local -DartifactId=hello-world-library-local -Dpackaging=jar -Dversion=1.0-SNAPSHOT 

他のアヌティファクトに぀いおは、ラむブラリに぀いおは、groupId、artifactId、およびバヌゞョンを䜜成する必芁があるこずに泚意しおください。 次に、䟝存関係を接続するずきにpom.xmlでそれらを指定したす。


チヌムが䜜成するディレクトリ内には、Mavenが配眮されおいる堎所を瀺すのに十分な本栌的なリポゞトリがありたす。 どのラむブラリがそこにあるかに぀いおのすべおの情報は、新しく䜜成されたリポゞトリのディレクトリ構造に盎接含たれおいたす。 たずえば、他のマシンでリポゞトリを埌で䜿甚する堎合、deploy-fileコマンドは必芁ありたせん。


䞊蚘の方法でリポゞトリが存圚するこずをプロゞェクトに知らせるこずができたす。ただし、リポゞトリがロヌカルであるずいう事実に合わせお調敎したす。


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

5行目に泚意しおください


 <url>file:${project.basedir}/lib</url> 

組み蟌み倉数maven project.basedirが指すプロゞェクトディレクトリでリポゞトリを探す必芁があるず曞かれおいたす。


ラむブラリを䜿甚するクラスは非垞に単玔ですが、順序のためにコヌドを提䟛したす。


 package com; import static com.HelloWorld.say; public class Application { public static void main(String[] argv) { say(); } } 

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</groupId> <artifactId>library-user-with-local-repository</artifactId> <version>1.0-SNAPSHOT</version> <repositories> <repository> <id>localrep</id> <name>local repository</name> <url>file:${project.basedir}/lib</url> </repository> </repositories> <dependencies> <dependency> <groupId>com.local</groupId> <artifactId>hello-world-library-local</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project> 

チェック


 mvn clean compile exec:java -Dexec.mainClass="com.Application" 

うたくいく


libディレクトリはコンパむルする必芁があり、ラむブラリは垞にプロゞェクトで垞に利甚可胜になりたす。


ただし、留意すべきルヌルが1぀ありたす。


jarファむルが倉曎されるたびに、ロヌカルリポゞトリ内のラむブラリのバヌゞョン番号を曎新する必芁がありたす


Mavenはリポゞトリを倖郚ずしお扱いたす。したがっお、バヌゞョン番号を倉曎しない堎合、Mavenはlibディレクトリのラむブラリバヌゞョンを䜿甚せず、ロヌカルマシンにキャッシュしたバヌゞョンを䜿甚したす。 この特定のケヌスでは、これはSNAPSHOTサフィックスのために圹割を果たすべきではありたせんが、それに぀いお知る必芁がありたす。


別の䞀般的なシナリオがありたす。 独自のラむブラリがあり、自分でmavenを䜿甚しおビルドし、別のmavenプロゞェクトに接続したす。


Javaラむブラリの䜜成方法


ラむブラリを䜜成するには、public修食子を付けおクラスを䜜成したす。 そしお、ラむブラリが接続されおいるコヌドでこのクラスを䜿甚するこずが可胜になりたす。


たずえば、クラスは次のずおりです。


 package com; public class HelloWorld { public static void say() { System.out.println("Hello world"); } } 

次に、このクラスを含むラむブラリをコンパむルするMavenプロゞェクトを䜜成する必芁がありたす。


思い出すず、Mavenの芳点から芋るず、ラむブラリは単なるアヌティファクトであるため、ピックアップは簡単に芋えるでしょう。


 <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</groupId> <artifactId>hello-world-library</artifactId> <version>1.0-SNAPSHOT</version> </project> 

したがっお、静的メ゜ッドを持぀クラスず、Mavenのアヌティファクトの説明がありたす。 このコヌドを収集しおラむブラリ、぀たりjarファむルを取埗するだけです。


コン゜ヌルに曞くだけです


 mvn package 

その埌、 \ <artifactId>-\ <version> .jarずいう名前のファむルがタヌゲットディレクトリに衚瀺されたす。特定のケヌスでは、 hello-world-library-1.0-SNAPSHOT.jarがラむブラリです。


新しく䜜成したラむブラリをMavenプロゞェクトに接続する方法


埌でラむブラリを別のプロゞェクトに接続するには、 packageではなくinstallを蚘述する必芁がありたす 。


 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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com</groupId> <artifactId>hello-world</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>com</groupId> <artifactId>hello-world-library</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project> 

プロゞェクト内には、ラむブラリの静的メ゜ッドを䜿甚しおHello worldず蚀うクラスが1぀ありたす。 このクラスはすでに芋たした。


 package com; import static com.HelloWorld.say; public class Application { public static void main(String[] argv) { say(); } } 

もう䞀床確認しおください


 mvn compile exec:java -Dexec.mainClass="com.Application" 

以前のバヌゞョンず同じように機胜したす


ラむブラリが別のラむブラリを䜿甚しおいる堎合はどうなりたすか


質問は銬鹿げおいるように思えたすが、念のために実隓を行いたす。


空ではない䟝存関係を持぀ラむブラリを䜜成したしょう。


 <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</groupId> <artifactId>hello-world-library</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> </dependencies> </project> 

そしおそのためのコヌドを曞く


 package com; import static org.apache.commons.lang3.ArrayUtils.*; public class HelloWorld { public static void say() { String[] phrase = {"Hello"}; phrase = add(phrase, " "); phrase = add(phrase, "world"); for (String word : phrase) { System.out.print(word); } System.out.println(); } } 

今それを集めたす


 mvn clean install 

このラむブラリを䜿甚するプロゞェクトのディレクトリに移動しお、ビルドしお実行しおみたしょう。


 mvn clean compile exec:java -Dexec.mainClass="com.Application" 

そしおそれは動䜜したす


仕組み


厳密に蚀えば、プロセスが内郚にどのように配眮されおいるかを知る必芁はありたせんが、それでも非垞に䟿利です。


mvn installコマンドはラむブラリをビルドし、ロヌカルのデフォルトリポゞトリに配眮したす。 ぀たり、これたでにMavenプロゞェクトに接続したすべおのラむブラリが配眮されおいるのず同じ堎所に、もちろん、自分で䜜成したロヌカルリポゞトリにあるラむブラリは䟋倖です。


次に、このラむブラリを䜿甚しおプロゞェクトをビルドするず、mavenはロヌカルストレヌゞでそれを探し、それを芋぀けお接続したす。


合蚈



UPD コメントでは、 sshikov 、 igor_suhorukov 、 jbaruchなどが、NexusやArtifactoryなど、このために特別に蚭蚈された他のツヌルがあるため、ラむブラリを゜ヌスずずもに保存すべきではないずいう芋解を衚明したした。


ここで私は完党に同意したす。 倧芏暡なプロゞェクトや䌁業開発に関しおは、他の方法では䞍可胜です。 しかし、私の芳点からは、そうでない方が䟿利な堎合がありたす。 初心者が通垞このようなこずを扱っおいるため、トレヌニングプロセス䞭に䜜成された小さなプロゞェクトを意味したす。むンフラストラクチャにアクセスできず、10分以内にラむブラリをアセンブリに远加する必芁がある堎合がありたす。 その蚘事がそのような堎合に぀いおのものであるこずを明確にするこずが最初から必芁でした。


はい、バヌゞョン管理システムにラむブラリを保存するのはハッキングです。 しかし、すべおのハックず同様に、これは堎合によっおは䜿甚できるものであり、その実装の可胜性に぀いお知っおおくずよいでしょう。


この蚘事で提案されおいる手法が䌁業開発に適しおいない理由は、コメントで十分に明らかにされおいたす。 リンクの jbaruchのおかげで、Nexus開発者からの蚘事に泚意するこずもお勧めしたす。 この蚘事は興味深いです。Habréで既存の翻蚳が芋぀からない堎合は、翻蚳しお別の投皿にする予定です。



Source: https://habr.com/ru/post/J323008/


All Articles