2016-10-09 143 views
0

將彈簧啓動集成到我現有的彈簧項目中時遇到問題。有樹的問題,我有,但在此之前我來這,讓我解釋一下我目前的架構:將彈簧啓動集成到現有彈簧罐獨立版

當前項目

我有兩個項目。第一個被稱爲myProject.toolkit,並且只有一個女巫中的主要類,我實現了一個無盡的do-while循環。該循環創建ProcessBuilder以啓動新的過程。當這個過程終止時,它檢查是否需要這個出口。如果是這樣,它會終止。如果不是,它會再次開始相同的過程(不是很漂亮,但我仍然在學習,也許我將來有更好的主意)。
第二個項目名爲myProject.dependencies,這是將從循環中的工具箱啓動的程序。這也是一個真正的項目,因爲工具包只有監視它​​的目的。

這兩個項目都是使用aspectJ編譯爲獨立jar文件的maven項目。
myProject.dependencies有sprint引導,hibernate和jpa。我的MySQL數據庫一切正常。我可以創建服務,這將使用存儲庫爲了持久的實體。

爲此,我創建了一個名爲JpaConfig的類,它具有所有需要的配置,因爲xml文件不起作用。它看起來縮短這樣的:

@EnableScheduling 
@EnableAsync 
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ) 
@ComponentScan(basePackages = {"myProject"}) 
@Configuration 
@EnableJpaRepositories 
public class JpaConfig { 

    @Bean 
    public InstrumentationLoadTimeWeaver loadTimeWeaver(){ 
     return new InstrumentationLoadTimeWeaver(); 
    } 

    @Bean 
    public DataSource dataSource(){ 
     // creates, configures and returnes a "BoneCPDataSource" Object 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(){ 
     // creates, configures and returnes a "LocalContainerEntityManagerFactoryBean" Object 
    } 

    @Bean 
    public JpaTransactionManager transactionManager(){ 
     // creates, configures and returnes a "JpaTransactionManager" Object 
    } 

} 

在我的主類myProject.dependencies項目我稱之爲魔線,以獲得彈簧工作:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JpaConfig.class); 

這一行配置被加載,我可以使用hibernate,jpa和spring的所有功能。

集成Spring啓動

現在我想春天開機添加到項目中,因爲我需要一個REST API。而且因爲我讀過春季靴子可以運行沒有tomcat或glassfish,也可以在一個罐子裏而不是戰爭,我認爲這對我來說是完美的體系結構。

所以我讀了一些文章爲了驗證這一點,並發現春季引導帶來了自己的集成tomcat,我試圖在我現有的項目中實現它。

添加以下的依賴,以我的pom.xml

<dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
     <version>1.4.1.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-tomcat</artifactId> 
     <version>1.4.1.RELEASE</version> 
     <!--<scope>provided</scope>--> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
     <version>1.4.1.RELEASE</version> 
    </dependency> 

而且因爲我不能設置一個父POM(我已經有一個父集和多父母都不在Maven的可能),我也加入這個我的POM不理解它,但由於這些線路是否也在org.springframework.boot:spring-boot-starter-parent:1.4.1.RELEASE,每個人都告訴我要依靠這種配置,我說的:

<pluginManagement> 
     <plugins> 
      <!-- Apply more sensible defaults for user projects --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-failsafe-plugin</artifactId> 
       <version>2.19.1</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>integration-test</goal> 
          <goal>verify</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-jar-plugin</artifactId> 
       <configuration> 
        <archive> 
         <manifest> 
          <mainClass>${start-class}</mainClass> 
          <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <configuration> 
        <includes> 
         <include>**/*Tests.java</include> 
         <include>**/*Test.java</include> 
        </includes> 
        <excludes> 
         <exclude>**/Abstract*.java</exclude> 
        </excludes> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>3.0.0</version> 
       <configuration> 
        <failOnMissingWebXml>false</failOnMissingWebXml> 
        <archive> 
         <manifest> 
          <mainClass>${start-class}</mainClass> 
          <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
         </manifest> 
        </archive> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>exec-maven-plugin</artifactId> 
       <configuration> 
        <mainClass>${start-class}</mainClass> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-resources-plugin</artifactId> 
       <version>2.6</version> 
       <configuration> 
        <delimiters> 
         <delimiter>${resource.delimiter}</delimiter> 
        </delimiters> 
        <useDefaultDelimiters>false</useDefaultDelimiters> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>pl.project13.maven</groupId> 
       <artifactId>git-commit-id-plugin</artifactId> 
       <version>2.1.11</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>revision</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <verbose>true</verbose> 
        <dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat> 
        <generateGitPropertiesFile>true</generateGitPropertiesFile> 
        <generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename> 
       </configuration> 
      </plugin> 
      <!-- Support our own plugin --> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
       <version>1.4.1.RELEASE</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>repackage</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <mainClass>${start-class}</mainClass> 
       </configuration> 
      </plugin> 
      <!-- Support shade packaging (if the user does not want to use our plugin) --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-shade-plugin</artifactId> 
       <version>2.4.3</version> 
       <dependencies> 
        <dependency> 
         <groupId>org.springframework.boot</groupId> 
         <artifactId>spring-boot-maven-plugin</artifactId> 
         <version>1.4.0.BUILD-SNAPSHOT</version> 
        </dependency> 
       </dependencies> 
       <configuration> 
        <keepDependenciesWithProvidedScope>true</keepDependenciesWithProvidedScope> 
        <createDependencyReducedPom>true</createDependencyReducedPom> 
        <filters> 
         <filter> 
          <artifact>*:*</artifact> 
          <excludes> 
           <exclude>META-INF/*.SF</exclude> 
           <exclude>META-INF/*.DSA</exclude> 
           <exclude>META-INF/*.RSA</exclude> 
          </excludes> 
         </filter> 
        </filters> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>shade</goal> 
         </goals> 
         <configuration> 
          <transformers> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
            <resource>META-INF/spring.handlers</resource> 
           </transformer> 
           <transformer implementation="org.springframework.boot.maven.PropertiesMergingResourceTransformer"> 
            <resource>META-INF/spring.factories</resource> 
           </transformer> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
            <resource>META-INF/spring.schemas</resource> 
           </transformer> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> 
           <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> 
            <mainClass>${start-class}</mainClass> 
           </transformer> 
          </transformers> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </pluginManagement> 
  1. 我需要所有的t他的插件?而且一個pluginManagement裏面沒有遺傳嗎?沒有必要?我需要什麼?

完成pom.xml後我修改的主類和添加了第二行到它:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(JpaConfig.class); 
ApplicationContext ctx = SpringApplication.run(SpringBootApp.class, args); 
  • 現在有兩個上下文。它可以開始,是的,但我不確定這是否有用。我不想配置所有的東西兩次。那麼,如何修改我的JpaConfig類以便配置彈簧引導。並繼續:我如何修改我的主類中的兩行,以便只進行一次配置?也許使用SpringApplication.run並給它JpaConfig類?但構造函數不允許這樣做。

  • 當我開始跟所有的修改這個當前項目,獨立,也許休眠和/或JPA和/或彈簧註釋搜索和圖片報兩次,我得到這個錯誤:

    org.springframework.beans。 factory.BeanDefinitionStoreException:無法處理配置類[myProject.dependency.spring.javaOnly.springBoot.SpringBootApp]的導入候選項;嵌套異常是java.lang.IllegalArgumentException:沒有在META-INF/spring.factories中找到自動配置類。如果您使用自定義打包,請確保該文件是正確的。 // ... 引起:java.lang.IllegalArgumentException:在META-INF/spring.factories中找不到自動配置類。如果您使用自定義打包,請確保該文件是正確的。

  • 我不太清楚這是什麼告訴我,因爲我在META-INF創建spring.factories,當我編譯它,有甚至兩個spring.factoriesMETA-INF文件夾內。我自己創建的一個和編譯器創建的一個。並且無論我在META-INF文件夾內是否有兩個或僅有一個spring.factories,錯誤仍然是相同的。
    但是,也許這一個將解決其他兩個問題時自行解決。所以非常感謝你爲這個長期職位和我可能愚蠢的問題提供的時間和耐心。但是,我希望你明白,我仍然在學習,並盡我所能改善,幾天後這些問題無法解決。所以感謝任何提示或/和幫助。

    回答

    1

    我的建議是將您現有的彈簧項目集成到彈簧引導項目中,作爲基於完整彈簧基礎結構(尤其是自動配置)構建的彈簧引導。

    而且

    1. 只有spring-boot-maven-plugin插件需要爲標準彈簧啓動項目 - doc
    2. 不需要AnnotationConfigApplicationContext這裏,SpringApplication類提供了一個方便的方式來啓動一個Spring應用程序,這將是從main()方法開始。在很多情況下,你可以委託給靜態方法SpringApplication.run方法

      ApplicationContext ctx = SpringApplication.run(SpringBootApp.class,args);

    3. Spring Boot建議您將主應用程序類(SpringBootApp)定位到其他類上方的根包中。Spring引導將在此處應用@ComponentScan以及默認的根包,所以它會默認加載您的JpaConfig,在此不需要@ComponentScan(basePackages = {"myProject"}),但這取決於項目中的包定義。
    4. META-INF/spring.factories用於註冊所有的自動配置類,如果你不需要需要你自定義的自動配置類,你可以刪除這個文件或者只是將這個文件平整爲空。

    好的旅程。

    +0

    起初,非常感謝您的時間。現在回答我的問題:1.好的,謝謝,我縮短了它。我不確定我是否需要它。當我的JpaConfig具有與個人更改的設置完全相同的配置時,我不希望該彈簧引導使用默認設置初始化配置。但是當我的應用程序工作時,我可以嘗試刪除'AnnotationConfigApplicationContext'行。 3.我知道'@ SpringBootApplication'包含'@ Configuration','@ EnableAutoConfiguration'和'@ ComponentScan'。所以2和3很可能是相同的:如何使用舊的'JpaConfig'類來使用spring引導? – christopher2007

    +0

    4.我不需要自定義自動配置類。我也不知道如何以及爲什麼,但默認情況下'META-INF/spring.factories'會在我的jar中編譯。這似乎是'spring-boot-maven-plugin'做到的。但是我的最後一個錯誤是一樣的,我也不會讓它刪除文件。那麼你的主要陳述意味着什麼? 「基於Spring的基礎設施」?我做錯什麼了嗎?我創建了像我的消息來源告訴我那樣做的結構。你有具體的代碼更改嗎? – christopher2007