跳到主要內容

Setting maven liquibase plugin of Spring-boot

Liquibase Migration

Laravel 的 Migration 是一個很棒的工具,
可以簡單的下個指令, 輕鬆的建立 tables
php artisan migrate

在 Spring-boot 也提供一套類似的工具, 使用起來大同小異, 只是設定上有點小麻煩。

dependencies


<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
</dependency>

build


<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
    </testResources>

    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.2</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
            </configuration>
        </plugin>

        <!--用來快速產生 migration-->
        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>3.5.3</version>
            <configuration>
                <url>jdbc:mysql://localhost:3306/liquibase_demo</url>
                <changeLogFile>src/main/resources/config/liquibase/master.xml</changeLogFile>
                <driver>com.mysql.jdbc.Driver</driver>
                <username>username</username>
                <password></password>
            </configuration>
        </plugin>
    </plugins>
</build>

application.yml



# database
database:
    host: localhost
    name: liquibase_demo
    username: root
    password:
spring:
    profiles:
        active: dev
    application:
        name: urad-facebook-data
    datasource:
        username: ${database.username}
        password: ${database.password}
        url: jdbc:mysql://${database.host}:3306/${database.name}?characterEncoding=utf-8&useUnicode=true&useSSL=false&rewriteBatchedStatements=TRUE

# liquibase configuration
liquibase:
    enabled: true
    change-log: classpath:config/liquibase/master.xml
    url: ${spring.datasource.url}
    user: ${spring.datasource.username}
    password: ${spring.datasource.password}

Changle Log

Change Log 的路徑, Srping-boot 預設為 db/changelog/db.changelog-master.yaml,
可以參考 文件, 我為了方便管理設定為 src/main/resources/config/liquibase/changelog/master.xml

Create User Table

<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" 
                      xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" 
                      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                      xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext 
                                         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd 
                                         http://www.liquibase.org/xml/ns/dbchangelog 
                                         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">
    <changeSet author="jerry (generated)" id="1511234719817-1">
        <createTable tableName="user">
            <column autoIncrement="true" name="id" type="INT UNSIGNED">
                <constraints primaryKey="true"/>
            </column>
            <column name="name" type="CHAR(32)"/>
            <column name="age" type="INT"/>
        </createTable>
    </changeSet>
</databaseChangeLog>

將 change log 添加到 master.xml

<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
                       http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">

    <include file="classpath:config/liquibase/changelog/00000000000000_initial_user_schema.xml" relativeToChangelogFile="false"/>
</databaseChangeLog>

Liquibase plugin 基本指令

liquibase:update: 將新的 change log 更新到目前的資料庫.

mvn liquibase:update

liquibase:generateChangeLog: 依據現有的資料庫的狀態, 產生 liquibase 的 Change log.

mvn liquibase:generateChangeLog

liquibase:dbDoc: 依據現有的資料庫的狀態, 產生 db doc 文件, 類似 Java doc, 參考 範例,
預設產出的文件路徑 target/liquibase/dbDoc/index.html

mvn liquibase:dbDoc

liquibase 文件



留言

這個網誌中的熱門文章

Spring boot Https 設定

1. 產生 SSL certificate keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650 Enter keystore password: Re-enter new password: What is your first and last name? [Unknown]: jerry What is the name of your organizational unit? [Unknown]: td What is the name of your organization? [Unknown]: com What is the name of your City or Locality? [Unknown]: taipei What is the name of your State or Province? [Unknown]: taiwan What is the two-letter country code for this unit? [Unknown]: tw Is CN=jarvis, OU=td, O=urad, L=taipei, ST=taiwan, C=tw correct? [no]: yes 這個 certificate 是 self-signed certificate 沒有經過第三方認證, 所以沒有公信力, 正式上線會在瀏覽器看到 連線不被信任 要有公信力的 certificate 最簡單的是 Lets Encrypt , 其他就是花一些錢找簽發 certificate 的組織 2. Enable HTTPS in Spring Boot Spring Boot 內建的 tomcat 預設 http 是 8080, Spring Boot 可以設定 http 跟 https, 但沒辦法同時存在這兩個設定, 如果要同時存在兩種 connection, 建議依照 文件 建議設定 https, 再透過 programmatically 去設定 http 會比較容易。 相關範例可以參考 : https://...

Google Compute Engine‎ - AccessDeniedExceptions 403

原因 打算從 instance 打包 logs 到 google cloud storage 發生了 AccessDeniedException: 403 Insufficient OAuth2 scope to perform this operation. , 看起來是 instance 沒有 storage 權限 解決 Reference: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes 重新設定 service account 權限 instance 上內建有 gcloud , 就直接用現有的工具查詢一下 instance 的 account. $ gsutil info 或者在本機直接 gcloud compute instances describe INSTANCE_NAMES Account: [alpha-number-compute@developer.gserviceaccount.com] Project: [our-project-name] 會看到 instance 的一些狀態, 接下來就簡單多了, 按照下列的說明, 要先 stop instance, 更改 storage scope 再重新 start 。 To change an instance's service account and access scopes, the instance must be temporarily stopped. To stop your instance, read the documentation for Stopping an instance. After changing the service account or access scopes, remember to restart the instance. # Stop Instance gcloud compute instances stop INSTANCE_NAMES # 設定 storage scope 為 full (Read, Write) gcloud co...

Java Process And Thread 筆記

英文很差,所以附上原文。 關係大概是這樣吧 Processes And Threads Processes (進程) 每個 Process 都可視為一個獨立運作的環境,有自己完整、私有的 Run-Time 資源,特別是每個 process 都有自己的記憶體空間。 Processes 聽起來很像 programs 或 application 的另一種說法,然而事實上一個 application 有可能是許多 processes 合作組成的。為了讓 processes 彼此互相合作,一些作業系統支援了 Inter Process Communication (IPC) resources,例如 pipes 與 sockets。IPC 不只讓不同的 processes 互相通訊,同時也支援不同系統的 pocesses 互相通訊。 大部分 JVM 實現的都是 single process。Java Application 可以創建額外的 process 透過 ProcessBuilder Object。 A process has a self-contained execution environment. A process generally has a complete, private set of basic run-time resources; in particular, each process has its own memory space. Processes are often seen as synonymous with programs or applications. However, what the user sees as a single application may in fact be a set of cooperating processes. To facilitate communication between processes, most operating systems support Inter Process Communication (IPC) resources, such as pipes and sockets. IPC is used not just for communication b...