Arbeiten mit der NPM-Registrierung von Java aus

Bild



NPM ist ein einzigartiges Paket-Repository aus der JavaScript-Welt. Grundsätzlich gibt es hier jene JS-Bibliotheken, die im Frontend / im Browser verwendet werden können, aber es gibt auch serverseitige Bibliotheken zur Verwendung in node.js und nicht nur. Wenn Sie ein Java-Programmierer sind und sich in das NPM-Repository integrieren müssen, haben Sie höchstwahrscheinlich einen der folgenden beiden Fälle:



  • Sie schreiben eine Webanwendung in einem der Java-Frameworks und bestimmte NPM-Pakete sind für die Clientseite erforderlich
  • Sie haben eine Java-Anwendung (z. B. für Android), die in der Lage sein muss, Abhängigkeiten und die Ressourcen / Pakete selbst von NPM anzufordern


Mal sehen, wie das in Java geht.



NPM-Ressourcen für eine Webanwendung



Sie haben 2 Möglichkeiten:



  • Packen Sie die erforderlichen NPM-Ressourcen in Ihr WAR / JAR
  • Verwenden Sie CDN, um die erforderlichen Ressourcen zur Laufzeit zu laden


NPM-Ressourcen in WAR / JAR verpacken



Zunächst müssen Sie mehr über WebJars erfahren . Damit können NPM-Pakete (und nicht nur) im Maven-Repository "reflektiert" werden. Auf diese Weise können Sie mit NPM-Paketen wie mit normalen Java-Paketen in Maven arbeiten. Um beispielsweise Ressourcen aus der bekannten Boostrap in Ihre WAR aufzunehmen, reicht es aus, pom.xml die folgende Abhängigkeit hinzuzufügen:



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


WebJars spiegelt Pakete von NPM nach Maven zusammen mit allen erforderlichen Abhängigkeiten wider. Wenn Sie also eine JAR über Abhängigkeiten verbinden, werden alle anderen erforderlichen Pakete verbunden.

WebJars verfügt außerdem über eine große Anzahl von Bibliotheken für verschiedene Java-Frameworks, um die Arbeit mit gepackten und verbundenen Ressourcen zu vereinfachen. Lesen Sie mehr in der Dokumentation .



WebJars ist ein großartiges Tool für jeden Java Backend-Entwickler. Es gibt aber auch leichtere Alternativen: Verpacken der erforderlichen Pakete von NPM mithilfe von Maven-Plugins. Hier ist eine möglicherweise nicht vollständige Liste:



  • jnpm-maven-plugin
  • Frontend-Maven-Plugin
  • npm-maven-plugin


Fügen Sie der Datei pom.xml die folgenden Zeilen hinzu , um beispielsweise die vue- und vuex-Pakete der erforderlichen Versionen mithilfe des jnpm-maven-Plugins einzuschließen :



<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>


Sie können die NPM-Notation verwenden, um den Bereich der erforderlichen Versionen zu definieren:



  • Sternchen (* | X | x) - 1. * entspricht> = 1.0.0 & <2.0.0
  • Tilde (~) - ~ 1,5 entspricht> = 1,5,0 & <1,6,0
  • Bindestrich (-) - 1,0-2,0 entspricht> = 1,0,0 & <= 2,0,0
  • Caret (^) - ^ 0.2.3 entspricht> = 0.2.3 & <0.3.0
  • Teilbereich - 1 entspricht 1.X oder> = 1.0.0 & <2.0.0
  • Negation -! (1.x) entspricht <1.0.0 &> = 2.0.0
  • Schwierig - ~ 1.3 | (1.4. * &! = 1.4.5) | ~ 2


Außerdem können Sie mithilfe von Einschlüssen und Ausschlüssen angeben, welche Dateien aus Paketen aufgenommen werden sollen. Beispielsweise enthält ein NPM-Paket normalerweise die "kompilierten" Dateien im Verzeichnis / dist. Andere Dateien sind Quelldateien und werden in einer Java-Webanwendung wahrscheinlich nicht benötigt oder sind nützlich. Um nur den Inhalt des dist / -Verzeichnisses einzuschließen, fügen Sie dem Abschnitt einfach Folgendes hinzu:



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


Standardmäßig packt das jnpm-maven-Plugin Ressourcen auf genau denselben Pfaden wie WebJars. Dadurch können die oben genannten WebJars-Bibliotheken für verschiedene Frameworks verwendet werden, um auf Ressourcen zuzugreifen. Wenn Sie ein anderes spezielles Verpackungsformat benötigen, lesen Sie bitte die Dokumentation .



CDN verwenden



Es gibt viele öffentlich verfügbare CDNs mit NPM-Ressourcen. Die bekanntesten und am häufigsten verwendeten:



  • UNPKG
  • JSDELIVR


Sie können auch Ihr eigenes CDN verwenden (z. B. über Docker ausgelöst) oder sogar die CDN-Funktionalität in Ihre Web-App einbetten. Fügen Sie beispielsweise das folgende Servlet zu web.xml hinzu, um das JNPM-CDN zu aktivieren. Nach Bedarf bearbeiten:



<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>


Nach dem Herunterladen des NPM-Servlets stehen die Ressourcen über das folgende URL-Format zur Verfügung: http (s): // <Domäne>: <Port> / <Pfad zur Webanwendung> / cdn / <NPM-Paket> / <Pfad zur Datei>.

Zum Beispiel:
localhost : 8080/cdn/vue@2.6.11/dist/vue.js




Arbeiten mit der NPM REST API von Java



Sie können die REST-API der NPM-Registrierung natürlich direkt verwenden, beispielsweise über Retrofit . Die entsprechende Dokumentation hilft Ihnen dabei . Es ist jedoch bequemer, die JNPM- Bibliothek zu verwenden , die einen Java-Wrapper für diese REST-API und mehr bereitstellt.



Fügen Sie das JNPM-Glas in die Datei pom.xml ein:



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


Initialisieren wir die JNPM-API:



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


Die JNPM-API bietet zwei Optionen: Synchrone API und Asynchrone API über RXJava. Was genau zu verwenden ist, liegt bei Ihnen:



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


Anwendungsbeispiel:



//   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);});


Wenn Sie einen speziellen Fall haben, der hier nicht beschrieben wurde - lassen Sie es mich bitte wissen!



All Articles