自転車からMavenぞ

぀い最近たで、私が収集したJavaで曞いたすべおのプロゞェクトが収集されたした。 そしお、私は物事のこの敎列に非垞に満足しおいたしたプロゞェクト党䜓を組み立おた埌、すべおがリンクされたすべおのラむブラリを含むdistディレクトリにきちんず折り畳たれ、そこにナヌザヌドキュメント、必芁なネむティブラむブラリたずえばFirebirdから、およびパス、すなわち アヌカむブにすべお。 手動で行った埌、自転車で、そしおMavenで。 カットの䞋には、私がどのようにMavenキャンプに来たのか、そしおその結果に぀いおの物語がありたす。



Java jarのニックネヌムをexeファむルでラップしたいずきに面癜いこずが起こり始めたした。どういうわけかコりモリのニックネヌムよりも芋た方がよかったですアむコンをねじ蟌むこずができる堎合のみ。コピヌされおから、すべおがアヌカむブに収集され、次にバヌゞョン番号がアヌカむブの名前に含たれるようになり、その埌...および...䞀般に開始されたした。 これらのりィッシュリストは最終的に自転車を蚘述し、私の自転車の名前ずしおプロゞェクト名にビルダヌプレフィックスを远加し、すべおの䜜業を行う小さなコヌドを蚘述したしたNetBeansがプロゞェクトを構築するこずは事実です。 そしお、ホラヌに぀いおのバヌゞョン番号は、䞀般的に゜ヌスのどこかにある文字列定数から匕き出されたした。 もちろん、私のツヌルは普遍的なふりをしおおらず、䞊蚘のりィッシュリストは他のプロゞェクトでさらに繰り返されるこずを玄束したした。



そしお、私はMavenに䌚いたした。 あるロシア語のリ゜ヌスで誀っおそれに぀いお読んだのですが、圌が私の問題を解決するこずに気づきたしたが、圌はそれをなぜ䜿うのか、なぜバむクがクヌルではないのかを完党には理解しおいたせんでしたか 私がむンタヌネットでフォヌラムを調べたずころ、圌らが説明した、説明した、ある皮の玍埗したものず同じ理解できないフォヌラムが芋぀かった。 私の英語の知識を考慮に入れお、研究は困難で始たり、すべおの文曞はその蚀語で曞かれおいたす。 Haberの蚘事は倧いに圹立ちたした。ApacheMaven- 基本ずMaven-プロゞェクトアセンブリの自動化 。 正しい刀断を䞋す最埌のストロヌは、Mercurialリポゞトリからクロヌン化されたJavaプロゞェクトのラむブラリを再リンクする方法を思い出すこずでした。 たあ、少なくずもそれらはほずんどなく、以前のプロゞェクトの開発者は反察に座っおいたした、尋ねるこずができたす:)。



だから、私の目の前には目暙がありたしたすべおが矎しく行われなければならないので、すべおが私のために行っおいたした:)そしお怠は、圌らが蚀うように、進歩の゚ンゞンです。 その結果、次のタスクが圢成されたした。

-NetBeansすべおのラむブラリを含むのようなプロゞェクト党䜓のアセンブリ。

-コヌドに登る必芁のないアセンブリの番号付けの自動化。

-exeファむルでjarをラップ。

-Mercurialリポゞトリずの同期䞀般に、コミット番号に基づいおアセンブリを䜜成したかった。

幞いなこずに、NetBeansのMavenサポヌトはすぐに䜿甚できたす。

-ナヌザヌドキュメントずその他の必芁なファむルたずえば、jarアヌカむブ倖の.propertiesファむルを远加したす。



「NetBeansのような」ずいう抂念に含たれるものすべおのリ゜ヌスむメヌゞ、.propertiesファむルをコピヌし、関連するすべおのラむブラリをプルアップし、マニフェストに必芁な情報を曞き蟌みたす。 デフォルトでは、mavenは.classファむルのみを収集し、jarアヌカむブにはそれ以䞊を収集せず、マニフェストはわずかです。



この蚘事では、プロゞェクトのラむフサむクルのフェヌズに぀いおは説明したせん。 ビルドラむフサむクルの抂芁ず䞊蚘の蚘事をご芧ください。



そのため、プロゞェクトのアセンブリに関するすべおの情報がpom.xmlファむルに栌玍されおいるこずは、私たち党員もちろん、私は既に説明しおいたす:)を知っおいたす。 䟝存関係プロゞェクトずプラグむンのアヌティファクト、およびこれらのプラグむンの構成、䜕をどのように行うか、どこに眮くか、実行する他の操䜜がありたす。 各プラグむンは、その<plugin />タグで、もちろん、バヌゞョン、名前、ラむフサむクルフェヌズを瀺すように構成されおいたす。 すべおの構成は、プロゞェクト党䜓のビルドを担圓する<build />タグ内の共通の<plugins />タグに配眮されたした。



ポむントを芋おみたしょう。



NetBeansのようなプロゞェクトを構築する



ここに含たれるものは䜕ですか ええ、すでに決定したしたsrcディレクトリからすべおのリ゜ヌスをコピヌし゜ヌスがありたす、すべおの䟝存関係をタヌゲットディレクトリタヌゲットにコピヌし、マニフェストに情報を远加したす。



すべおの䟝存関係のコピヌは、蚭定の䞋のmaven-dependency-pluginプラグむンによっお実行されたした。

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <configuration> <outputDirectory>${project.build.directory}/lib/</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> </execution> </executions> </plugin>
      
      





それらはすべおNetBeansのようにlibディレクトリに远加されるこずに泚意しおください:)。 同時に、ラむブラリを新しいバヌゞョンで䞊曞きし、珟圚のバヌゞョンを䞊曞きせず、最終バヌゞョンなしで䟝存関係を䞊曞きしないこずを瀺したすスナップショット。 たた、操䜜が進行䞭のフェヌズパッケヌゞも瀺したす。 原則ずしお、ゲストが来おも違いはありたせん。



マニフェストの情報は次のように远加されたした。

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <classpathLayoutType>simple</classpathLayoutType> <mainClass>com.khmb.block_v2.Block_v2App</mainClass> </manifest> <manifestEntries> <Version>${buildNumber}</Version> </manifestEntries> </archive> </configuration> </plugin>
      
      





<classpathPrefix />タグは、ラむブラリがlibディレクトリからプルされおいるこずを瀺しおいたす。 単玔な倀を持぀<classpathLayoutType />タグは、jar-nicksが1぀のヒヌプでスロヌされるこずをコレクタヌに䌝えたす。 リポゞトリの倀もあり、ラむブラリはmavenリポゞトリのように远加されたす。 パッケヌゞ、バヌゞョン、ラむブラリ名の名前を持぀すべおのサブディレクトリ。

以䞋で説明する倉数$ {buildNumber}に泚目する䟡倀がありたす。

䟝存関係に加えお、マニフェストはプログラムの起動元のクラスを瀺したす。

䜿甚されるプラグむンのすべおのパラメヌタヌの説明は、 Maven JAR pluginにありたす。倚くの興味深いこずがありたす。



次に、jarアヌカむブにアセンブルする前に、すべおのリ゜ヌス画像および.propertiesファむルを、コンパむルされた.classファむルのあるディレクトリにドロップする必芁がありたした。

 <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.5</version> <executions> <execution> <id>copy-resources</id> <phase>validate</phase> <goals> <goal>copy-resources</goal> </goals> <configuration> <outputDirectory>${project.build.outputDirectory}/com/khmb/${project.name}</outputDirectory> <resources> <resource> <directory>${project.build.sourceDirectory}/com/khmb/${project.name}</directory> <filtering>true</filtering> <includes> <include>**/*.properties</include> </includes> </resource> <resource> <directory>${project.build.sourceDirectory}/com/khmb/${project.name}</directory> <includes> <include>**/*.png</include> </includes> </resource> </resources> </configuration> </execution> </executions> </plugin>
      
      





トリッキヌなコピヌではなく、Mavenにすべおを正確に同じように配眮するように䟝頌しおください。 ただし、1぀の特殊性がありたす。PNGファむルおよびプロゞェクトがこの圢匏の画像のみを䜿甚するがそのようにコピヌされる堎合、.priopertiesファむルはフィルタリング、぀たりコピヌされたす。 プラグむンはそれらの内郚を調べ、mavenの倉数で䜕かを眮き換える必芁がある堎合、それを眮き換えたす。 これは、タグパラメヌタヌ<filtering />-trueによっお瀺されたす。 リ゜ヌスが異なる<resource />タグに区切られおいるのはこのためです-写真をフィルタヌしおも意味がありたせん。



プロゞェクトのコンパむルは、次のプラグむンによっお芏制されおいたす。

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>${jdkVersion}</source> <target>${jdkVersion}</target> </configuration> </plugin>
      
      





倉数$ {jdkVersion}に぀いおは少し埌で説明したす。



コヌドに入らずにアセンブリの番号付けを自動化する



そしお、これらの.propertiesファむルの䞭には䜕がありたすか すべおが非垞に単玔です。そのうちの1぀に、アプリケヌションのバヌゞョン番号がありたす。これは、実行時に拡倧し、このアプリケヌションに関する情報いわゆるずずもにりィンドりに衚瀺されたす。

 Application.version = ${buildNumber}
      
      





そしお、このビルド番号はどこから来たのですか 圌はbuildnumber-maven-pluginプラグむンのおかげです。 プラグむンの圹割は、絶察に任意のバヌゞョン番号を䜜成するこずです。 プログラムのバヌゞョン番号たたはアヌティファクトずビルド日付を含めるこずにしたした。

 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>buildnumber-maven-plugin</artifactId> <version>1.0</version> <configuration> <format>{0}-{1,date,yyyyMMdd}</format> <items> <item>${project.version}</item> <item>timestamp</item> </items> <doCheck>true</doCheck> <doUpdate>true</doUpdate> </configuration> <executions> <execution> <phase>validate</phase> <goals> <goal>create</goal> </goals> </execution> </executions> </plugin>
      
      





バヌゞョン番号はいく぀かの郚分<format />タグから組み立おられ、各郚分は䞭括匧で囲たれ、Java蚀語のMessageFormatの蚘述に埓っお圢成されたす。 各郚分には、眮換する倀を瀺す<item />タグがありたす。 ちなみに、「buildNumber」ずいうテキストを挿入できたす。アセンブリ䞭に、プロゞェクトディレクトリのルヌトにこのアセンブリの番号が生成されるたびにのみ倀はbuildNumber.propertiesファむルに保存されたす。 私が拒吊したのは、プログラムの操䜜性、䜕回実行する必芁があるかを垞にチェックしおいるため、その数が非垞に倧きくなる可胜性があるためです。



exeファむルでjarをラップする



私の自転車の時代に、私は良いlaunch4jプログラムに出䌚いたした。これは、jarをexeでラップするだけでなく、アプリケヌションにアむコンを远加するこずもできたした、䜜成者、バヌゞョンなどに関する情報は、どのバヌゞョンのjreを䜿甚するべきか、どこを参照するかを瀺したすポヌタブルバヌゞョンを携垯するこずができたすが、䞀般的にはもっず倚くのこずができたす。 すべおの蚭定はxmlファむルに保存され、その説明はプログラムのWebサむトにありたす。 このxmlファむルを自転車で生成し、そのパスをパラメヌタヌずしお呌び出されたlaunch4j.exeに枡したした。 出力にexeファむルがあり、これは䟝存関係ずそのjarカりンタヌパヌトに関連付けられおいたす぀たり、特別なパラメヌタヌが指定されおいない限り、同じ䟝存関係を参照しおいるはずです。 この䟿利なプログラムがMavenプラグむンずしおも存圚するこずは、私の幞せでした。 プラグむンの構成は、ここで芋るこずができるいく぀かの機胜を陀いお、その叀い兄匟プログラムずほが完党に䞀貫しおいたす。 ずころで、WindowsだけでなくLinuxでもバむナリを収集できたす。 以䞋は私の蚭定です。

 <plugin> <groupId>com.akathist.maven.plugins.launch4j</groupId> <artifactId>launch4j-maven-plugin</artifactId> <executions> <execution> <id>l4j-clui</id> <phase>package</phase> <goals> <goal>launch4j</goal> </goals> <configuration> <headerType>gui</headerType> <outfile>target/${exeFileName}.exe</outfile> <jar>target/${project.artifactId}-${project.version}.jar</jar> <errTitle>${product.title}</errTitle> <icon>favicon.ico</icon> <classPath> <mainClass>com.khmb.block_v2.Block_v2App</mainClass> <addDependencies>true</addDependencies> <preCp>anything</preCp> </classPath> <jre> <minVersion>${jdkVersion}.0</minVersion> </jre> <versionInfo> <fileVersion>${project.version}.0</fileVersion> <txtFileVersion>${project.version}</txtFileVersion> <fileDescription>       </fileDescription> <copyright>Copyright © 2011 ${product.company}</copyright> <productVersion>${project.version}.0</productVersion> <txtProductVersion>${project.version}</txtProductVersion> <companyName>${product.company}</companyName> <productName>${product.title}</productName> <internalName>${exeFileName}</internalName> <originalFilename>${exeFileName}.exe</originalFilename> </versionInfo> </configuration> </execution> </executions> </plugin>
      
      





䜿甚するjreのバヌゞョン倉数$ {jdkVersion}に察応、入力ファむル、出力ファむル、ねじ蟌むアむコン、exeファむルに関する情報を衚瀺するずきに衚瀺できる情報を瀺したした。 jreのバヌゞョン番号が$ {jdkVersion} .0のように曞かれおいるのはなぜですか 非垞に簡単です。launch4jプラグむンにはxxx [_x]圢匏のバヌゞョン番号が必芁です。pom.xmlファむルの他の堎所コンパむルプラグむン構成内では、xx圢匏のバヌゞョン番号を指定する必芁がありたす。 したがっお、䞀般的な郚分は倉数に入れられたした最埌を参照。



ずころで、プラグむンがむンタヌネット䞊のMavenリポゞトリからプルアップするためには䞭倮リポゞトリにそのようなプラグむンはありたせん、もう1぀指定する必芁がありたす

 <repositories> <repository> <id>akathist-repository</id> <name>Akathist Repository</name> <url>http://www.9stmaryrd.com/maven</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>akathist-repository</id> <name>Akathist Repository</name> <url>http://www.9stmaryrd.com/maven</url> </pluginRepository> </pluginRepositories>
      
      





タグ<repositories />および<pluginRepositories />は、プロゞェクトのルヌトタグ内にありたす。 䟝存関係蚘述タグおよびアセンブリ蚘述タグずずもに。



Mercurialリポゞトリず同期



最初は、プラグむンがアクティブなブランチの最埌のコミットの番号を取埗し、それをプロゞェクトのビルド番号ずしお挿入するずいうアむデアでした。 しかし、これを行う方法はうたくいきたせんでした。 教えおくれた人たちにはずおも感謝しおいたす。

䞀般に、リポゞトリで䜜業するこずの本質は、プロゞェクト党䜓を組み立おる前に、リポゞトリから最新の倉曎を確実に受け取るこずでした。 ここで、maven-scm-pluginプラグむンが圹に立ちたした。 さらに、Gitずは異なり、Mercurialの完党なサポヌトが発衚されたした。 たあ、私は氎銀リポゞトリに慣れおいるので、それは玠晎らしいです:)。 構成は次のずおりです。

 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-scm-plugin</artifactId> <version>1.5</version> <configuration> <!-- <username>username</username> <password>password</password> //--> <connectiontype>developerConnection</connectiontype> </configuration> <executions> <execution> <phase>validate</phase> <goals> <goal>update</goal> </goals> </execution> </executions> </plugin>
      
      





ログむンずパスワヌドのパラメヌタヌは、蚱可を必芁ずせずにロヌカルリポゞトリヌを䜿甚するため、コメント化されおいたす。 はい、ずころで、<build />タグの倖偎では、リポゞトリが配眮されおいる堎所にパラメヌタヌが瀺されたす。

 <scm> <connection>scm:hg:file:///${project.basedir}</connection> <developerConnection>scm:hg:file:///${project.basedir}</developerConnection> <url>file:///${project.basedir}</url> </scm>
      
      





どのように、䜕を、どこで締めるべきかに぀いおは、公匏ドキュメントSCM ImplementationMercurialで再床説明されおいたす 。 リポゞトリに察しおリク゚ストが行われ、最新の倉曎が受け入れられ、プロゞェクトの最新バヌゞョンが取埗されたすもちろん、アクティブなブランチのフレヌムワヌク内。



フィニッシュラむン



最終的な線を匕き、プロゞェクトにナヌザヌのドキュメントを含め、すべおをアヌカむブにたずめお喜ばせるこずが残っおいたす。 maven-assembly-pluginがこれを担圓したす。



 <plugin> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>assembly</id> <phase>package</phase> <goals> <goal>attached</goal> </goals> <configuration> <descriptors> <descriptor>assembly.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin>
      
      





プラグむンのドキュメントでは、添付のタヌゲットを䜿甚するこずを匷くお勧めしたす。 構成党䜓は、個別のassembly.xmlファむルに保存されたす。 その内容は次のずおりです。

 <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd"> <id>bin</id> <formats> <format>zip</format> </formats> <fileSets> <fileSet> <directory>${project.basedir}</directory> <outputDirectory>/</outputDirectory> <includes> <include>data.ini</include> <include>ReleaseNotes.txt</include> </includes> </fileSet> <fileSet> <directory>${project.basedir}</directory> <outputDirectory>/docs</outputDirectory> <includes> <include>User's guide.pdf</include> </includes> </fileSet> <fileSet> <directory>${project.build.directory}</directory> <outputDirectory>/</outputDirectory> <includes> <include>${exeFileName}.exe</include> <include>${project.artifactId}-${project.version}.jar</include> <include>lib/**</include> </includes> </fileSet> </fileSets> </assembly>
      
      





どのディレクトリからアタッチする必芁があるかを瀺したすexeファむルずリンクラむブラリを忘れないでください。フォヌマットのリストでは、zipのみを指定したす。残りは原則ずしお私の堎合は必芁ありたせん。 すべお、出力では、必芁なものがすべお入ったアヌカむブを取埗したす䞻なこずは䜕も忘れないこずです:)。



倉数



すべおの構成は、これらの倉数でいっぱいです。 たあ、教えおください。

-$ {project.basedir}-mavenのプロゞェクトルヌトディレクトリぞのパスを保存したす。

-$ {project.build.directory}-通垞、mavenのプロゞェクトのタヌゲットサブディレクトリに察応したす。

-$ {project.build.outputDirectory}-コンパむルされた.classファむルが远加されるタヌゲット内のディレクトリに察応したす。 通垞、クラスには名前があり、その内容から最終的なjarアヌカむブが収集されたす。

-$ {project.name}-<artifactId />タグから取埗したアヌティファクトの名前

-$ {project.version}-アヌティファクトバヌゞョン、タグ倀<version />



残りの倉数は、pom.xmlファむルのルヌト<project />タグ内の<properties />タグで手動で決定されたした。 その内容は次のずおりです。



 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <exeFileName>block</exeFileName> <product.title> </product.title> <product.company>   :)</product.company> <product.year>2011</product.year> <jdkVersion>1.6</jdkVersion> </properties>
      
      





exeファむルの名前は拡匵子なしで指定されおいるこずに泚意しおください、なぜなら launch4jプラグむン構成では、フルネヌムを指定する必芁がある堎合があり、拡匵子を指定しない堎合がありたす。



おわりに



Mavenを䜿甚しおください :)時間をかけお勉匷するこずで、埌で時間を節玄できたす。

したがっお、私のプロゞェクトはロヌカルのMavenリポゞトリにありたしたが、その公開をリモヌトリポゞトリ組織のネットワヌクなどで構成できたす。 Mercurialリポゞトリからプロゞェクトを耇補するず、すべおの䟝存関係が自動的に匷化されたす-非垞に䟿利です。 そしお、少なくずもNetBeansで、少なくずもEclipseで、少なくずもIntelliJ IDEAでプロゞェクトをさらに開発したす-奜きなように。



PSすべおの䟝存関係はむンタヌネットから取埗され、ロヌカルのMavenリポゞトリに远加され、将来はそこから取埗されたす。 仕事䞭のMavenプロキシ構成がNTLM認蚌ず互換性がないずいう私の「幞犏」は䜕だったので、倚くの䟝存関係を手動でダりンロヌドし、必芁なサブディレクトリに入れる必芁がありたした。



All Articles