sql >> データベース >  >> RDS >> PostgreSQL

Embedded PostgreSQL Server Javaコンポーネントを個別のサービスとして使用するにはどうすればよいですか?

    ここでの中心的な問題は、プラグインの2つの異なる目標間でいくつかの状態を共有できるようにすることです:start プロセスを起動し、次にstopする目標 それを殺すゴール。そのための良い方法は、 ContextEnabled すべてのmojoが実装するインターフェース。 getPluginContext() モジョ間で共有するオブジェクトを格納できる(生の)マップを返すメソッド。

    このアプローチでは、作成したものをstartに保存できます。 プラグインの目標を達成し、stopに戻します ゴール。これを実際に示すための最小限の例を次に示します。ここでは、単純な文字列値がmojo間で共有されています。

    Mavenプラグインプロジェクトを設定する 。これは基本的に、Java 8と構成用のアノテーションを使用して、Mavenプラグインの標準POMである次のPOMを持つプロジェクトを持つことになります。

    <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>sample.plugin</groupId>
      <artifactId>test-maven-plugin</artifactId>
      <version>1.0.0</version>
      <packaging>maven-plugin</packaging>
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>
      <build>
        <plugins>
          <plugin>
            <artifactId>maven-plugin-plugin</artifactId>
            <version>3.5</version>
          </plugin>
        </plugins>
      </build>
      <dependencies>
        <dependency>
          <groupId>org.apache.maven</groupId>
          <artifactId>maven-plugin-api</artifactId>
          <version>3.3.9</version>
        </dependency>
    
        <!-- dependencies to annotations -->
        <dependency>
          <groupId>org.apache.maven.plugin-tools</groupId>
          <artifactId>maven-plugin-annotations</artifactId>
          <version>3.4</version>
          <scope>provided</scope>
        </dependency>
      </dependencies>
    </project>
    

    タイプmaven-pluginのパッケージに注意してください これは、これがプラグインプロジェクトであることをMavenに宣言します。この新しいプロジェクトでは、次のStartMojoを検討してください。 :

    @Mojo(name = "start", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
    public class StartMojo extends AbstractMojo {
    
        @SuppressWarnings("unchecked")
        @Override
        public void execute() throws MojoExecutionException {
            getPluginContext().put("myService", new MyService("foo"));
        }
    
    }
    

    これは、新しいstart モジョ これはデフォルトで pre-integration-test 段階。プラグインコンテキストを取得し、それに新しいオブジェクトを配置します。上記では、これはMyServiceと呼ばれる単純なカスタムPOJOです。 これはコンストラクターで値を取ります。このオブジェクトは、"myService"のキーにマップされています 、ルックアップとして機能します。

    次に、次のことができます。

    @Mojo(name = "stop", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST)
    public class StopMojo extends AbstractMojo {
    
        @Override
        public void execute() throws MojoExecutionException {
            MyService service = (MyService) getPluginContext().get("myService");
            getLog().info(service.getValue());
        }
    
    }
    

    これは、新しいstopを宣言しています。 デフォルトで post-integration-test 段階。プラグインコンテキストを取得し、キー"myService"の下のオブジェクトを抽出します 、そして最後にその値を取得してログに記録します。

    このMavenプラグインをパッケージ化してインストールした後(mvn clean installを使用) )ローカルリポジトリに、サンプルプロジェクトで使用できます

    <plugin>
      <groupId>sample.plugin</groupId>
      <artifactId>test-maven-plugin</artifactId>
      <executions>
        <execution>
          <id>sample</id>
          <goals>
            <goal>start</goal>
            <goal>stop</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    

    mvn clean verifyを実行する場合 そのサンプルプロジェクトでは、最終的に"foo"になります。 ログのpost-integration-testに出力されます 段階。これは、値がstartによって正しく設定されたことを示しています。 mojo、そしてstopによって正しく取得されます モジョ。

    もちろん、Stringだけでなく、複雑なオブジェクトをこのマップに格納できます。 (より簡単な解決策があるかもしれません)。特に、processのホストになる可能性があります 停止したいインスタンス。 exec-maven-pluginを取り除くことができます 、startで組み込みデータベースをセットアップするためにすでに必要なコードを含む新しいMavenプラグインを作成します 目標、この目標のプラグインコンテキストにプロセスインスタンスを保存し、最後に別のstopでこのプロセスを停止します プラグインコンテキストから取得することでmojo。



    1. ユーザーのテーブルにID列が必要なのはなぜですか?

    2. エラー:INSERTEXECステートメントをネストできません。およびINSERT-EXECステートメント内でROLLBACKステートメントを使用することはできません。これを解決する方法は?

    3. mysqlテーブルに存在しない値を取得する

    4. テーブル'/tmp/#sql_18b4_0.MYI'のキーファイルが正しくありません。修復しようとしました