Maven:カスタムディレクトリ構造のリポジトリへのアクセス

すべてにご挨拶。



小さな自転車をコミュニティと共有したい-カスタム構造でリポジトリにアクセスできるようにするMavenの拡張機能。

はじめに、どうやってこれに到達したかを説明します。 プロジェクトに取り組む過程で、JQueryのようなJavaScriptの依存関係は何によっても制御されないという考えを思いつきました。 そのため、javascriptを除き、ある種の依存関係マネージャーを見つけたいという強い要望がありました。 まず、検索でBowerに出会いましたが、ビルドプロセス中に追加の手順を導入する必要があるため、依存関係のnode.jsが怖くなりました。 それから、jsライブラリを非選択的にドラッグできるCDNを思い出しました(たとえば、Google CDNのjquery:http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js)。 プロジェクトではアセンブリにmavenを使用しているため、論理的な考えはこれらのライブラリデポジットに設定することでした...しかし、それほど単純ではないことが判明しました。 実際のところ、CDNファイルシステムの構造はmavenの標準とは異なります。 解決策を探して2時間たっても、インターネットで解決策を見つけることができなかったため、自転車を書くことにしました。 疲れていないなら、猫をお願いします。

既製のソリューションを検索する過程で、カスタムタイプのリポジトリを処理するmavenの拡張機能を作成できることに気付きました。 確かに、どこでもできることが書かれていたにもかかわらず、その方法はどこにも書かれていませんでした。 RepositoryConnectorFactoryインターフェースがこの目的に役立つという事実を一度だけフラッシュしました。 急いで、このインターフェイスを実装する単純なクラスがスローされました:

@Component(role = RepositoryConnectorFactory.class, hint = "custom") public class CustomRepositoryConnectorFactory implements RepositoryConnectorFactory, Service { @Override public RepositoryConnector newInstance(RepositorySystemSession session, RemoteRepository repository) throws NoRepositoryConnectorException { System.out.println("CustomRepositoryConnectorFactory.newInstance()"); return null; } @Override public int getPriority() { return 1; } @Override public void initService(ServiceLocator locator) { } }
      
      



しかし、拡張機能をプロジェクトに接続した後、奇跡は起こりませんでした-拡張機能は呼び出されず、Mavenはサポートされていないタイプのリポジトリを引き続き誓いました。 後で判明したように、拡張機能が正しく機能するためには、META-INF / plexus / components.xmlファイルでコンポーネントの説明を生成する必要があります。 これを作成するには、plexus-component-metadataプラグインを使用します。これは、クラスの注釈を解析し、このマジックファイルを作成します。
  <plugin> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-component-metadata</artifactId> <version>1.5.5</version> <executions> <execution> <goals> <goal>generate-metadata</goal> </goals> </execution> </executions> </plugin>
      
      



components.xmlの生成を有効にし、ローカルリポジトリにプラグインをインストールすると、すべてが機能しました。



次に、この不名誉の使い方を説明します。 まず、リポジトリをプラグインに接続します(これまでのところリポジトリに配置しましたが、将来はMaven Centralに配置する方法を考えます)。
  <pluginRepositories> <pluginRepository> <id>maven-burtsev-net</id> <url>http://maven.burtsev.net</url> </pluginRepository> </pluginRepositories>
      
      





そして、ビルドpom.xmlセクションで拡張機能を有効にします。
  <build> <extensions> <extension> <groupId>net.burtsev.maven</groupId> <artifactId>maven-custom-repository-layout</artifactId> <version>1.0</version> </extension> </extensions> </build>
      
      





次のように、必要なリポジトリを接続します。
  <repository> <id>google-cdn</id> <url>http://ajax.googleapis.com/ajax/libs/$groupId/$version/$artifactId${classifier(prefix:.)}.$extension</url> <layout>custom</layout> </repository>
      
      





リポジトリURLには、アップロードされたアーティファクトの適切なパラメーターに置き換えられるワイルドカードが含まれています。 サポートされているすべてのワイルドカードをリストします。

値が空の可能性があるパラメーターには、代替構文$ {classifier(prefix:。)}を使用できます。 これは、パラメーターが空の場合にURLの区切り文字が重複しないようにするために行われます。

リポジトリを接続した後、次のような依存関係を接続します。
  <dependencies> <dependency> <groupId>jquery</groupId> <artifactId>jquery</artifactId> <version>1.8.2</version> <classifier>min</classifier> <type>js</type> </dependency> </dependencies>
      
      





ダウンロードしたライブラリをWebアプリケーションフォルダーにコピーするには、maven-dependency-pluginを使用します。
  <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>generate-resources</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/${project.build.finalName}/js</outputDirectory> <includeArtifactIds>jquery</includeArtifactIds> <includeTypes>js</includeTypes> </configuration> </execution> </executions> </plugin> </plugins>
      
      





実際にはすべて。 問題は解決しました-Mavenを使用してJS依存関係を操作する機能を実現しました。



プラグインのソースコードは、 https//bitbucket.org/eburtsev/maven-custom-repository-layoutにあります。

プラグイン自体は、私のMavenリポジトリから直接使用できます: http : //maven.burtsev.net/

説明されている拡張機能https://bitbucket.org/eburtsev/test-javascript-dependenciesを使用したサンプルプロジェクト




All Articles