5

Hi Wiosna Boot Eksperci -Wiosna Boot klasy opakowania uber słoik wykorzenić zamiast BOOT-INF/classes

Próbuję utworzyć startowy wiosna uber słoik, który musi zostać wdrożony w klastrze apache burzy. Ale w tym przypadku Storm spodziewa się wszystkich plików klas w katalogu głównym słoika, podczas gdy spakowane pliki aplikacji znajdują się w "BOOT-INF/classes", gdy są spakowane przy użyciu "wiosennego-boot-maven-plugin".

Czy istnieje sposób, że moje klasy aplikacji mogą być pakowane bezpośrednio pod katalogiem głównym zamiast "BOOT-INF/classes"?

Próbowałem użyć "maven-assembly-plugin" z "spring-boot-maven-plugin", jak pokazano poniżej, który tworzy słoik Uber z wszystkimi plikami klasy z słoików zależności zapakowanych w katalogu głównym uber jar, ale klasy aplikacji wciąż znajdują się w BOOT-INF/classes.

<plugins> 
    <plugin> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-maven-plugin</artifactId> 
     <configuration> 
      <excludes> 
       <exclude> 
        <groupId>org.apache.storm</groupId> 
        <artifactId>storm-core</artifactId> 
       </exclude> 
      </excludes> 
      <requiresUnpack> 
       <dependency> 
        <groupId>com.myorg</groupId> 
        <artifactId>my-app-artifact</artifactId> <!-- This does not help! :(--> 
       </dependency> 
      </requiresUnpack> 
     </configuration> 
    </plugin> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.4</version> 
     <configuration> 
      <appendAssemblyId>false</appendAssemblyId> 
      <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
      </descriptorRefs> 
     </configuration> 
     <executions> 
      <execution> 
       <id>make-assembly</id> 
       <phase>package</phase> 
       <goals> 
        <goal>single</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 
</plugins> 

Odpowiedz

5

Tak, dla mojej przyszłej siebie lub dla każdego, kto stara się znaleźć odpowiedź na podobne pytanie. Oto różne rzeczy, które realizowane podczas moich badań na ten -

  1. Burza chce wykonywalny plik java jar
  2. Wiosna Boot dostarcza opakowania zwyczaj jar. Chociaż potwierdza z opakowaniem java jar, Wiosna Boot ładuje zajęcia z bagażnika-INF/classes

Tak więc, aby uczynić pracę jar Wiosna Boot na klastrze burzy natomiast zachowuje się jak wiosenny Boot - musielibyśmy tworzyć kopię wszystkich klas z BOOT-INF/classes do katalogu głównego pliku jar.

Czy to możliwe? a odpowiedź brzmi: tak.

Korzystając z tego podejścia, opisałam: here, udało mi się utworzyć słoik Spring Boot z klasami BOOT-INF/skopiowanymi do katalogu głównego soku Spring Boot. Takie podejście wymaga ant build.xml, ustawień bluszczu i pliku bluszcz.xml, jak pokazano poniżej. (Zastrzeżenie: config testowane tylko do pakowania nie na klastrze burzy)

Ponieważ jesteśmy w stanie stworzyć Jar Wiosna Boot posiekany z klasami u nasady -

powinniśmy zrobić? NR.

Oto powody -

  1. Wiosna zdecydowanie nie radzi biorąc to podejście nie do końca się z niepożądanymi klasa zastąpić i klasa wersjonowania kwestii dla klas o tych samych nazwach w całej pliki jar i z różnymi wersjami.

  2. Opakowanie typu Boot jar nie jest formatem przeznaczonym do użycia jako słoik zależności. Read the first line here. W związku z przypadkami użycia zależności należy trzymać się zwykłych starych modułów java. Spring Boot służy do tworzenia większej liczby samodzielnych plików wykonywalnych lub do wdrażania w takich kontenerach jak tomcat.

Powodzenia!

kompilacja.xml

<project 
     xmlns:ivy="antlib:org.apache.ivy.ant" 
     xmlns:spring-boot="antlib:org.springframework.boot.ant" 
     name="spring-boot-sample-ant" 
     default="build"> 

    <description> 
     Sample ANT build script for a Spring Boot executable JAR project. Uses ivy for 
     dependency management and spring-boot-antlib for additional tasks. Run with 
     '$ ant -lib ivy-2.2.jar spring-boot-antlib.jar' (substitute the location of your 
     actual jars). Run with '$ java -jar target/*.jar'. 
    </description> 

    <property name="spring-boot.version" value="1.4.2.RELEASE" /> 
    <property name="lib.dir" location="${basedir}/target/lib" /> 
    <property name="start-class" value="com.my.main.class" /> 

    <target name="resolve" description="--> retrieve dependencies with ivy"> 
     <ivy:retrieve pattern="${lib.dir}/[conf]/[artifact]-[type]-[revision].[ext]" /> 
    </target> 

    <target name="classpaths" depends="resolve"> 
     <path id="compile.classpath"> 
      <fileset dir="${lib.dir}/compile" includes="*.jar" /> 
     </path> 
    </target> 

    <target name="init" depends="classpaths"> 
     <mkdir dir="target/classes" /> 
    </target> 

    <target name="compile" depends="init" description="compile"> 
     <javac srcdir="src/main/java" destdir="target/classes" classpathref="compile.classpath" /> 
    </target> 

    <target name="clean" description="cleans all created files/dirs"> 
     <delete dir="target" /> 
    </target> 

    <target name="build" depends="compile"> 
     <spring-boot:exejar destfile="target/${ant.project.name}-${spring-boot.version}.jar" classes="target/classes"> 
      <spring-boot:lib> 
       <fileset dir="${lib.dir}/runtime" /> 
      </spring-boot:lib> 
     </spring-boot:exejar> 
    </target> 

    <target name="unjar_dependencies" depends="compile"> 
     <unzip dest="target/classes"> 
      <fileset dir="${lib.dir}/compile"> 
       <include name="my-app-common-0.1-SNAPSHOT.jar" /> 
      </fileset> 
     </unzip> 
    </target> 

    <!-- Manual equivalent of the build target --> 
    <target name="manual" depends="compile, unjar_dependencies"> 
     <jar destfile="target/manual/${ant.project.name}-${spring-boot.version}.jar" compress="false"> 
      <mappedresources> 
       <fileset dir="target/classes" /> 
       <globmapper from="*" to="BOOT-INF/classes/*"/> 
      </mappedresources> 
      <mappedresources> <!-- **** this mapped resources block does what I was looking for **** --> 
       <fileset dir="target/classes" /> 
       <globmapper from="*" to="/*"/> 
      </mappedresources> 
      <mappedresources> 
       <fileset dir="src/main/resources" erroronmissingdir="false"/> 
       <globmapper from="*" to="BOOT-INF/classes/*"/> 
      </mappedresources> 
      <mappedresources> 
       <fileset dir="${lib.dir}/runtime" /> 
       <globmapper from="*" to="BOOT-INF/lib/*"/> 
      </mappedresources> 
      <zipfileset src="${lib.dir}/loader/spring-boot-loader-jar-${spring-boot.version}.jar" /> 
      <manifest> 
       <attribute name="Main-Class" value="org.springframework.boot.loader.JarLauncher" /> 
       <attribute name="Start-Class" value="${start-class}" /> 
      </manifest> 
     </jar> 
    </target> 
</project> 

ivysettings.xml

<ivysettings> 
    <settings defaultResolver="chain" /> 
    <resolvers> 
     <chain name="chain" returnFirst="true"> 
      <!-- NOTE: You should declare only repositories that you need here --> 
      <filesystem name="local" local="true" m2compatible="true"> 
       <artifact pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[module]-[revision].[ext]" /> 
       <ivy pattern="${user.home}/.m2/repository/[organisation]/[module]/[revision]/[module]-[revision].pom" /> 
      </filesystem> 
      <ibiblio name="ibiblio" m2compatible="true" /> 
      <ibiblio name="spring-milestones" m2compatible="true" root="http://repo.spring.io/release" /> 
      <ibiblio name="spring-milestones" m2compatible="true" root="http://repo.spring.io/milestone" /> 
      <ibiblio name="spring-snapshots" m2compatible="true" root="http://repo.spring.io/snapshot" /> 
     </chain> 
    </resolvers> 
</ivysettings> 

ivy.xml

<ivy-module version="2.0"> 
    <info organisation="org.springframework.boot" module="spring-boot-sample-ant" /> 
    <configurations> 
     <conf name="compile" description="everything needed to compile this module" /> 
     <conf name="runtime" extends="compile" description="everything needed to run this module" /> 
     <conf name="loader" description="Spring Boot loader used when manually building an executable archive" /> 
    </configurations> 
    <dependencies> 
     <dependency org="org.springframework.boot" name="spring-boot-starter" rev="${spring-boot.version}" conf="compile"> 
       <exclude org="ch.qos.logback" name="logback-classic"/> 
     </dependency> 

     <dependency org="org.springframework.boot" name="spring-boot-loader" rev="${spring-boot.version}" conf="loader->default" /> 

     <dependency org="org.apache.storm" name="storm-core" rev="1.0.2"> 
      <exclude org="org.apache.logging.log4j" name="log4j-slf4j-impl"/> 
      <exclude org="org.apache.logging.log4j" name="log4j-core"/> 
     </dependency> 

     <dependency org="com.mycompany" name="app-common" rev="0.1-SNAPSHOT"/> 

     <dependency org="org.apache.storm" name="storm-kafka" rev="1.0.2"/> 

     <dependency org="org.apache.kafka" name="kafka_2.10" rev="0.10.1.0"/> 

     <dependency org="org.apache.kafka" name="kafka_2.10" rev="0.10.1.0"/> 

     <dependency org="org.apache.httpcomponents" name="httpcomponents-client" rev="4.5.2"/> 

     <dependency org="org.eclipse.paho" name="org.eclipse.paho.client.mqttv3" rev="1.1.0"/> 

     <dependency org="com.amazonaws" name="aws-java-sdk-s3" rev="1.11.53"/> 

     <dependency org="com.jcraft" name="jsch" rev="0.1.54"/> 

     <dependency org="io.netty" name="netty-handler" rev="3.7.0.Final"/> 


    </dependencies> 
</ivy-module> 
1

Czy istnieje sposób mogę mieć moje klasy aplikacji pakowane bezpośrednio w katalogu głównym zamiast "BOOT-INF/classes"?

Tak, wystarczy użyć Spring Boot 1.3. Powrót do Maven ... w pom.xml jeśli deklarują rodzica tak:

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.5.RELEASE</version> 
</parent> 

następnie swoje klasy (i inne pliki) zostaną umieszczone na poziomie głównym. To jest "stary sposób" na wiosenny rozruch.

W wersji 1.4 zmieniono strukturę słojów sprężynowych, aby użyć katalogu BOOT-INF. Tak więc, jeśli użyjesz na przykład <version>1.4.1.RELEASE</version>, twoje zajęcia będą pod BOOT-INF/classes. Niepożądanym skutkiem ubocznym jest to, że pliki konfiguracyjne (np. Application.properties, application-myprofile.properties itp.) Będą również znajdować się w klasach BOOT-INF /, nawet jeśli nie są klasami Java.