Frage Mache ein grooviges Skript und schnappe dir ein Glas wie Traube aus dem Dateisystem


Traube scheint ziemlich gut zu funktionieren, um Gläser zu deinem Klassenpfad hinzuzufügen. Es macht auch viele andere Dinge wie Holen und Abhängigkeitsmanagement. z.B.

#!/home/robert/bin/groovy

import org.apache.commons.lang.StringUtils

@Grab(group='commons-lang', module='commons-lang', version='2.4')

def strings = ['Hello', 'Groovy', 'AVeryLongWord!', 'A simple sentence']
strings.each { String aString ->
    println "$aString: ${StringUtils.abbreviate(aString,10)}"
}

Leider, wenn es ein Glas in meinem Dateisystem gibt, das ich möchte dynamisch zum Dateisystem hinzufügen, dann muss ich auf viel zurückgreifen hässlichere Lösung.

#!/home/robert/bin/groovy

def loader = this.class.classLoader.rootLoader
loader.addURL(new File("/home/robert/somejars/arithmetic-1.1.jar").toURI().toURL())

// can't use traditional package import
arithmeticMainClass = Class.forName("org.scharp.arithmetic.Main")

println "42 - 23 = " + arithmeticMainClass.subtract(42, 23)

// can't use "new" operator
myArithmeticObject = arithmeticMainClass.newInstance()

Gibt es eine Möglichkeit, aus dem Dateisystem Traub ein Glas zu machen? Wenn nicht, kann ich irgendwie replizieren, was in Groovy / Java passiert?

Ich würde mir wünschen, dass diese Lösung für Skripts funktioniert, die von vielen Benutzern und vielen inkompatiblen JARs ausgeführt werden können. Das Hinzufügen von JARs zu einem gemeinsamen Verzeichnis wie ~ / .groovy / lib / funktioniert nicht.

Ich könnte ein lokales Maven-Repository für lokale Jar-Libraries erstellen das scheint übertrieben zu sein.


13
2018-05-14 17:33


Ursprung


Antworten:


So habe ich das gelöst. Wenn Traube (Efeu) etwas will, wird es unter der ~/.groovy/grapes Verzeichnis. Alles, was Sie tun müssen, ist nur Ihre eigene efeu.xml-Datei zu erstellen und Ihr Glas dort hinein zu werfen. Ich habe es herausgefunden, indem ich mir nur einige andere Artefakte angesehen habe, die von Maven heruntergeladen wurden. Hier ist ein kleines Beispiel .....

Wir verwenden Oracle hier und ich wollte, dass es die jdbc-JAR-Datei ist, die von meinen Groovy-Skripten "gepackt" werden kann. Leider konnte ich kein Repository finden, das dieses Glas im Internet hatte.

  • Schritt 1: Verzeichnis erstellen ~/.groovy/grapes/com.oracle
  • Schritt 2: Verzeichnis erstellen ~/.groovy/grapes/com.oracle/ojdbc6
  • Schritt 3: Verzeichnis erstellen ~/.groovy/grapes/com.oracle/ojdbc6/jars
  • Schritt 4: Holen Sie sich eine Kopie der ojdbc-Jar-Datei von Oracle und benennen Sie sie um. Unsere Oracle-Version ist 11.2.0.1.0 und wir verwenden Java6, also habe ich die lokal installierte Datei ojdbc6.jar und kopiere sie als ojdbc6-11.2.0.1.0.jar. Diese Datei habe ich in das im vorherigen Schritt erstellte Verzeichnis abgelegt.
  • Schritt 5: Erstellen Sie ein Efeu-11.2.0.1.0.xml Config-Dateien auszuführen.Diese Datei sollte in die 2. Ich stark auf Beispiele verlassen Für diesen Schritt in Schritt erstellte Verzeichnis gesetzt werden von anderen Artefakte packte. Jede Apache Commons Lib ist ein gutes Beispiel.

Hier ist mein XML.

<?xml version="1.0" encoding="UTF-8"?>
<ivy-module version="2.0" xmlns:m="http://ant.apache.org/ivy/maven"
>
  <info organisation="com.oracle" module="ojdbc6" revision="11.2.0.1.0" status="release" publication="20130102153401">
    <license name="" />
    <description homepage="">Oracle ojdbc driver</description>
  </info>
  <configurations>
    <conf name="default" visibility="public" description="" extends="runtime,master" />
    <conf name="master" visibility="public" description="" />
    <conf name="compile" visibility="public" description="" />
    <conf name="provided" visibility="public" description="" />
    <conf name="runtime" visibility="public" description="" extends="compile" />
    <conf name="test" visibility="public" description="" extends="runtime" />
    <conf name="system" visibility="public" description="" />
    <conf name="sources" visibility="public" description="" />
    <conf name="javadoc" visibility="public" description="" />
    <conf name="optional" visibility="public" description="" />
  </configurations>
  <publications>
    <artifact name="ojdbc6" type="jar" ext="jar" conf="master" />
  </publications>
</ivy-module>

Jetzt kann ich dieses Glas in meinen groovigen Skripten mit folgenden verwenden ....

@Grapes([
  @GrabConfig(systemClassLoader=true),
  @Grab('com.oracle:ojdbc6:11.2.0.1.0'),
])
import groovy.sql.*


Um die Bereitstellung dieser Trauben auf mehreren Servern zu vereinfachen, habe ich eine Zip-Datei erstellt, die ich überall extrahieren konnte ....

$ unzip -qql oracle_jdbc_groovy_grape.zip
        0  06-11-2012 13:50   .groovy/grapes/com.oracle/
        0  06-12-2012 14:17   .groovy/grapes/com.oracle/ojdbc6/
        0  06-12-2012 14:17   .groovy/grapes/com.oracle/ojdbc6/jars/
  2111220  06-11-2012 11:46   .groovy/grapes/com.oracle/ojdbc6/jars/ojdbc6-11.2.0.1.0.jar
     2349  06-11-2012 11:50   .groovy/grapes/com.oracle/ojdbc6/ivy-11.2.0.1.0.xml

7
2017-11-05 16:45



Sie können Passe die Efeueinstellungen an die Grape verwendet, indem sie ein ~/.groovy/grapeConfig.xml Datei.

Im Folgenden finden Sie ein Beispiel für die Verwendung des lokalen Dateisystems als Repository:

<ibiblio name="local" root="file:${user.home}/.m2/repository/" m2compatible="true"/>

4
2018-05-15 13:57



Es gab ein gewisses Interesse daran, diese Eigenschaft der Traube hinzuzufügen aber nichts Ernstes. Meine Vermutung ist, dass es unwahrscheinlich ist, dass dies in naher Zukunft hinzugefügt wird. (6-18 Monate)


1
2018-05-27 16:50