2016-06-22 42 views
0

我將flyway集成到一個新項目中,如果我執行該類,則拋出IDE,遷移工作正常。但我也想讓遷移從命令行通過jar文件開始。但是,如果我用Maven構建工程,執行jar文件,我得到一個異常:從jar文件執行的飛行路徑遷移

Exception in thread "main" java.lang.NoClassDefFoundError: org/flywaydb/core/api/migration/jdbc/JdbcMigration 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:73) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:368) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:362) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:361) 
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) 
at de.toom.controller.ContentMigrationApplication.main(ContentMigrationApplication.java:5) 
Caused by: java.lang.ClassNotFoundException: org.flywaydb.core.api.migration.jdbc.JdbcMigration 
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) 

如果我使用SpringJdbcMigration在其他線程提到的,我得到了同樣的異常。

的pom.xml:

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/*.sql</include> 
      </includes> 
     </resource> 
    </resources> 

    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.5.1</version> 
     </plugin> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>exec-maven-plugin</artifactId> 
      <version>1.5.0</version> 
      <executions> 
       <execution> 
        <goals> 
         <goal>java</goal> 
        </goals> 
       </execution> 
      </executions> 
      <configuration> 
       <mainClass>com.test.controller.ContentMigrationApplication</mainClass> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-jar-plugin</artifactId> 
      <version>3.0.1</version> 
      <configuration> 
       <archive> 
       <manifest> 
        <addClasspath>true</addClasspath> 
        <mainClass>com.test.controller.ContentMigrationApplication</mainClass> 
       </manifest> 
       </archive> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

<dependencies> 
    <!-- ====================================================================== --> 
    <!-- External dependencies --> 
    <!-- ====================================================================== --> 
    <dependency> 
     <groupId>org.flywaydb</groupId> 
     <artifactId>flyway-core</artifactId> 
     <version>4.0.3</version> 
    </dependency> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.39</version> 
    </dependency> 
</dependencies> 

ContentMigrationApplication.java:

public class ContentMigrationApplication { 
    public static void main(String[] args) { 
     ContentMysqlMigration contentMysqlMigration = new ContentMysqlMigration(); 

     contentMysqlMigration.migrateDatabase(args); 
    } 
} 

ContentMysqlMigration.java

public class ContentMysqlMigration implements JdbcMigration { 
    private static final String DATABASE_DRIVER_CONNECTION = "jdbc:mysql://"; 
    private static final String SERVER_ADDRESS = "localhost"; 
    private static final String SERVER_ADDRESS_PORT = ":3306"; 
    private static final String SERVER_DATABASE_NAME = "/test"; 
    private static final String SERVER_USERNAME = "test"; 
    private static final String SERVER_PASSWORD = "test"; 

    public ContentMysqlMigration() {} 

    public void migrateDatabase(String[] args) { 
     Flyway flyway = new Flyway(); 

     flyway.setBaselineOnMigrate(true); 

     flyway.setDataSource(DATABASE_DRIVER_CONNECTION + SERVER_ADDRESS + SERVER_ADDRESS_PORT + SERVER_DATABASE_NAME, 
       SERVER_USERNAME, SERVER_PASSWORD); 

     flyway.migrate(); 
    } 

    public void migrate(Connection connection) throws Exception {} 
} 

回答

3

那是因爲你的罐子不包含的依賴關係。

您看到java.lang.NoClassDefFoundError: org/flywaydb/core/api/migration/jdbc/JdbcMigration

您的jar只包含您的源的.class。

+0

感謝您的回答! 有了maven,它應該工作,當我提供依賴或?我定義了一個範圍,但這不起作用。 我試圖將資源複製到資源文件夾並將它們與我的課程相關聯,但沒有任何結果。源文件位於jar文件中,但無法找到。 – Dubstef

+0

最簡單(最骯髒)的方法是使用Maven遮罩插件,它將創建一個包含所有內容的超級瓶子,它應該適合你 –