2017-06-24 88 views
3

我有一個簡單的EnvironmentPostProcessor實施春季啓動項目:春季啓動投用行家依賴ClassNotFoundException的另一個項目

package com.example.demo; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.env.EnvironmentPostProcessor; 
import org.springframework.core.env.ConfigurableEnvironment; 

public class DevProfilerResolverEnvironmentPostProcessor implements EnvironmentPostProcessor { 

     @Override 
     public void postProcessEnvironment(ConfigurableEnvironment configurableEnvironment, SpringApplication springApplication) { 
      if (configurableEnvironment.getActiveProfiles().length == 0) { 
       if (System.getenv().get("OS").contains("Windows")) { 
        configurableEnvironment.addActiveProfile("DEV"); 
       } 
      } 
     } 
    } 

而且,我註冊這個類來sprig.factories

org.springframework.boot.env.EnvironmentPostProcessor = com.example.demo.DevProfilerResolverEnvironmentPostProcessor 

現在結構看起來像:

enter image description here

片段從POM文件:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
    http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.example</groupId> 
    <artifactId>demo</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>demo</name> 
    <description>Demo project for Spring Boot</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.5.4.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

我與Maven執行:

MVN安裝

現在我想用在另一個春天啓動該項目實施EnvironmentPostProcessor。因此我添加它來扶養部分新項目:

<dependency> 
     <groupId>com.example</groupId> 
     <artifactId>demo</artifactId> 
     <version>0.0.1-SNAPSHOT</version> 
    </dependency> 
</dependencies> 

而且我寫了簡單的服務使用:

@Service 
@Profile("DEV") 
public class DeveloperService { 

    @Scheduled(cron = "1/1 * * * * ?") 
    public void doWork() { 
     System.out.println("Developers.... "); 
    } 
} 

and enabled scheduling for main class: 

@SpringBootApplication 
@EnableScheduling 
public class LvivBootApplication { 

    public static void main(String[] args) { 
     SpringApplication.run(LvivBootApplication.class, args); 
    } 
} 

但是,我得到了以下主要執行後異常:

14:56:09.822 [main] ERROR org.springframework.boot.SpringApplication - Application startup failed 
java.lang.IllegalArgumentException: Unable to instantiate factory class: org.springframework.boot.env.EnvironmentPostProcessor 
Caused by: java.lang.ClassNotFoundException: com.example.demo.DevProfilerResolverEnvironmentPostProcessor 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

並將依賴項添加到新項目中:

enter image description here

我正在Windows環境中運行它。

這個想法是當操作系統是Windows添加DEV配置文件的第一個項目。 其次,在配置文件爲DEV時打印控制檯虛擬信息的服務,並計劃每秒打印一次。

我在這個例子中找不到什麼東西?

SOLUTION:

對於從第一個項目庫jar pom製作應該是固定的類似以下內容:

<!--<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
      <configuration> 
       <executable>true</executable> 
      </configuration> 
     </plugin> 
    </plugins> 
</build>--> 

或簡單的消除從POM文件這個插件。

回答

5

你的第一個jar不是庫jar。它是一個重新包裝的啓動jar,由spring啓動插件創建,包含第一個彈簧啓動應用程序及其所有依賴關係,旨在執行,而不是用作庫。

如果您想將其用作庫,則需要使用非重新包裝的jar文件,其中只包含項目的類和資源。但是,讓應用程序依賴於另一個應用程序是非常奇怪的事情。您應該創建一個庫項目,只包含常用的公共類和資源,並將它用作您的兩個spring引導應用程序的依賴項。

+0

如何製作第一個項目jar庫?我是否需要將其他配置添加到pom文件? –

+0

與創建任何Maven項目的方式相同,但不使用spring啓動插件。 –

+0

作品像迷人的。 –