JavaからNPMレジストリを操作する

画像



NPMは、JavaScriptの世界からのユニークなパッケージリポジトリです。基本的にここにフロントエンド/ブラウザで使用できるJSライブラリがありますが、node.jsだけでなく使用するためのサーバー側ライブラリもあります。Javaプログラマーであり、NPMリポジトリーと統合する必要がある場合は、次の2つのケースのいずれかが発生する可能性があります。



  • Javaフレームワークの1つでWebアプリケーションを作成しており、クライアント側には特定のNPMパッケージが必要です。
  • Javaアプリケーション(たとえば、Android用)があり、NPMから依存関係とリソース/パッケージ自体を要求できる必要があります


これをJavaで実行する方法を見てみましょう。



WebアプリケーションのNPMリソース



2つのオプションがあります。



  • 必要なNPMリソースをWAR / JAR内にパックします
  • CDNを使用して、実行時に必要なリソースをロードします


NPMリソースをWAR / JARにパッケージ化する



まず、WebJarsなどについてもっと学ぶ必要があります。これにより、NPM(だけでなく)パッケージをMavenリポジトリに「ミラーリング」できます。このようにして、Mavenの通常のJavaパッケージと同じようにNPMパッケージを操作できます。たとえば、よく知られているBoostrapのリソースをWARに含めるには、pom.xmlに次の依存関係を追加するだけで十分です。



<dependency>
    <groupId>org.webjars.npm</groupId>
    <artifactId>bootstrap</artifactId>
    <version>4.5.0</version>
</dependency>


WebJarsは、NPMからMavenへのパッケージを必要なすべての依存関係とともに反映するため、依存関係によって1つのJARを接続することにより、他のすべての必要なパッケージが接続されます。

WebJarsには、パックされ接続されたリソースの操作を容易にするために、さまざまなJavaフレームワーク用のライブラリの大規模なセットもあります。詳細については、ドキュメントをご覧ください



WebJarsは、Javaバックエンド開発者にとって優れたツールです。しかし、より軽い代替手段もあります。Mavenプラグインを使用してNPMから必要なパッケージをパッケージ化します。これはおそらく完全ではないリストです:



  • jnpm-maven-plugin
  • フロントエンド-maven-plugin
  • npm-maven-plugin


たとえば、jnpm-maven-pluginを使用して必要なバージョンのvueおよびvuexパッケージを含めるには、pom.xmlに次の行を追加します。



<plugin>
    <groupId>org.orienteer.jnpm</groupId>
    <artifactId>jnpm-maven-plugin</artifactId>
    <version>1.0</version>
	<executions>
		<execution>
			<goals>
				<goal>install</goal>
			</goals>
			<configuration>
				<packages>
					<package>vue@2.6.11</package>
					<package>vuex@~3.4.0</package>
				</packages>
			</configuration>
		</execution>
	</executions>
</plugin>


NPM表記を使用して、必要なバージョンの範囲を定義できます。



  • アスタリスク(* | X | x)-1。*> = 1.0.0&<2.0.0と同等
  • ティルデ(〜)-〜1.5は> = 1.5.0&<1.6.0と同等です
  • ハイフン(-)-1.0-2.0は> = 1.0.0&<= 2.0.0と同等です
  • カレット(^)-^ 0.2.3は> = 0.2.3&<0.3.0と同等です
  • 部分範囲-1は1.Xまたは> = 1.0.0&<2.0.0に相当します
  • 否定-!(1.x)は、<1.0.0&> = 2.0.0と同等です。
  • 難しい-〜1.3 | (1.4。*&!= 1.4.5)| 〜2


また、includesとexcludesを使用して、パッケージから含めるファイルを指定できます。たとえば、通常、NPMパッケージには/ distディレクトリに「コンパイル済み」ファイルが含まれています。他のファイルはソースファイルであり、JavaWebアプリケーション内で必要になったり有用になったりする可能性はほとんどありません。dist /ディレクトリの内容のみを含めるには、セクションに以下を追加するだけです。



<includes>
  <include>dist/*</include>
</includes>


デフォルトでは、jnpm-maven-pluginはWebJarsとまったく同じパスにリソースをパックします。これにより、上記のWebJarsライブラリをさまざまなフレームワークで使用してリソースにアクセスできます。その他の特定のパッケージ形式が必要な場合は、ドキュメント参照してください



CDNの使用



NPMリソースを備えた公開されているCDNは多数あります。最も有名で使用されている:



  • UNPKG
  • JSDELIVR


独自のCDNを使用することも(たとえば、dockerを介して発生させる)、CDN機能をWebアプリ内に埋め込むこともできます。たとえば、次のサーブレットをweb.xmlに追加して、JNPMCDNを有効にします。必要に応じて編集します。



<servlet>
  <servlet-name>CDNServlet</servlet-name>
  <servlet-class>org.orienteer.jnpm.cdn.CDNServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>CDNServlet</servlet-name>
  <url-pattern>/cdn/*</url-pattern>
</servlet-mapping>


NPMサーブレットをダウンロードすると、次の形式のURLを介してリソースを利用できるようになります。http(s):// <ドメイン>:<ポート> / <Webアプリケーションへのパス> / cdn / <NPMパッケージ> / <ファイルへのパス>。

例えば:
localhost:8080 / cdn / vue @ 2.6.11 / dist / vue.js




JavaからのNPMRESTAPIの操作



あなたはもちろん、直接NPMレジストリREST APIを使用することができ、経由言うレトロフィット対応するドキュメントがこれに役立ちますただし、このRESTAPIなどのJavaラッパーを提供するJNPMライブラリを使用する方が便利です。



JNPMJarをpom.xmlに含めます。



<dependency>
    <groupId>org.orienteer.jnpm</groupId>
    <artifactId>jnpm</artifactId>
    <version>1.0</version>
</dependency>


JNPMAPIを初期化してみましょう。



JNPMService.configure(JNPMSettings.builder()
  .homeDirectory(Paths.get("/home/myuser/.jnpm")) //
  .downloadDirectory(Paths.get("/tmp")) //
  //   - . 
 	.build());


JNPM APIには、同期APIとRXJavaを介した非同期APIの2つのオプションがあります。正確に何を使用するかはあなた次第です:



JNPMService jnpmService = JNPMService.instance(); //Synchronous Java API
RxJNPMService rxJnpmService = JNPMService.instance().getRxService() //RXJava API


使用例:



//   NPM 
System.out.println(JNPMService.instance().getRegistryInfo());
//       VUE
System.out.println(JNPMService.instance().getPackageInfo("vue").getLatest());
//   vue@2.6.11
System.out.println(JNPMService.instance().getVersionInfo("vue", "2.6.11").getDescription());
//      
System.out.println(JNPMService.instance().bestMatch("vue@<2").getVersionAsString());
//   vue@2.6.11    
VersionInfo vueVersion = JNPMService.instance().getVersionInfo("vue", "2.6.11");
vueVersion.downloadTarball().blockingAwait();
System.out.println(vueVersion.getLocalTarball().getAbsolutePath());
// "vue"     
System.out.println(JNPMService.instance().search("vue").getObjects().get(0).getSearchPackage().getDescription());
//       dev    vue 
//            NPM (node_modules/vue  ..)
JNPMService.instance().getRxService()
   .traverse(TraverseDirection.WIDER, TraversalRule.DEV_DEPENDENCIES, "vue")
   .subscribe(t -> {System.out.println(t); t.install(Paths.get("target", "readme"), InstallationStrategy.NPM);});


ここに記載されていない特定のケースがある場合は、お知らせください。



All Articles