** アップデート **
エラーの再現を試み、最小限、完全、かつ検証可能な例を作成しようとしました。残念ながら、最初から再起動する手法を実行した後でも、自分でエラーを再現することさえできないようです...
hibernate3:hbm2java コマンドを手動で実行すると、アプリケーションが動作します。
それでも、プログラム的には機能しないようです。
アプリケーションを実行すると、巨大なエラー ログが表示されます。上の数行は次のとおりです。
at ClassRealm[plexus.core, parent: null] (via modules: org.eclipse.sisu.wire.WireModule -> org.eclipse.sisu.plexus.PlexusBindingModule)
while locating org.apache.maven.project.ProjectBuilder
while locating org.apache.maven.DefaultMaven
12 errors
私の設定をこのレポにプッシュしました。機能するには、pw: "password" を含む (in mem) MySQL データベースが必要です。
https://github.com/Weirdfishees/reverse-engineering.git
これが私の構成です:
ポンポン:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<components>
<component>
<name>hbm2java</name>
<outputDirectory>src/main/java</outputDirectory>
<implementation>jdbcconfiguration</implementation>
</component>
</components>
<componentProperties>
<revengfile>/src/main/resources/META-INF/reveng.xml</revengfile>
<configurationfile>/src/main/resources/META-INF/hibernate.cfg.xml</configurationfile>
<jdk5>true</jdk5>
<ejb3>true</ejb3>
</componentProperties>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.0.8</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>2.1_3</version>
</dependency>
</dependencies>
</plugin>
</plugins>
<dependencies>
<!-- ... -->
<!-- this is not needed for the example, but after executing hibernate3:hbm2java, no compile errors will show -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.1.0.Final</version>
</dependency>
<!-- to prevent error SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.18</version>
</dependency>
<!-- ... -->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-wagon</artifactId>
<version>0.9.0.M2</version>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-http-lightweight</artifactId>
<version>2.5</version>
</dependency>
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE hibernate-configuration SYSTEM "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/sakila?autoreconnect=true&usessl=false?autoreconnect=true&usessl=false</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
</session-factory>
</hibernate-configuration>
reveng.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE hibernate-reverse-engineering SYSTEM "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd">
<hibernate-reverse-engineering>
<schema-selection match-schema="sakila"/>
<table-filter match-name=".*" package="nl.sander.m.localhost.sakila"/>
そして、application.java
package reverseengineer;
import java.io.File;
import org.apache.maven.cli.MavenCli;
public class Application {
public static void main(String[] args) {
System.setProperty("maven.multiModuleProjectDirectory", new File(".").getAbsolutePath());
MavenCli cli = new MavenCli();
cli.doMain(new String[]{"hibernate3:hbm2java"}, ".", System.out, System.out);
}
}
私の質問は同じままです。
上記の構成で hibernate3:hbm2java をプログラムで実行するにはどうすればよいですか?
-- 再現できませんが、追加情報 --
序章
こんにちはスタックオーバーフローユーザーの皆さん、Maven Embedder の使い方について質問があります。
実際のコード部分に要約する前に、私の質問の文脈を共有したいと思います。
ユーザーからの入力を受け取る GUI アプリケーション (javaFX) を構築しています。この入力に基づいて、アプリケーションは 2 つの hibernate 構成ファイル (hibernate.cfg.xml および reveng.xml) を動的に生成します。これらの構成ファイル (接続の詳細を提供する) に基づいて、次のアプリケーションの望ましい機能は、データベースを自動的に(ユーザーの操作なしで) リバース エンジニアリングし、すべてのテーブルの POJO クラスを作成することです (ボトムアップ開発)。
mvn hibernate3:hbm2java 引数を手動で実行すると (コマンド ラインを使用するか、単に eclipse で -> maven build.. -> 目標 mvn hibernate3:hbm2java として実行)、必要なすべてのクラスを含む目的のパッケージが作成されます。
ただし、目標は、手動で行うのではなく、mvn hibernate3:hbm2java をプログラムで実行することです。
リサーチ
次のオプションを試しました。
WindowsでJavaコードからMavenを実行していますか?
private void executeHbmToJava() {
try {
Runtime.getRuntime().exec("cmd \\c hibernate3:hbm2java");
} catch (IOException e) {
e.printStackTrace();
}
}
このオプションはエラーをスローしませんが、プログラムで何も起こらないようです (Eclipse でビューを更新した後、目的のクラスが存在しません...)
このオプションが機能する場合でも、アプリケーションのコンテキストにより、Maven Embedder を使用することを好みます (アプリケーションはクロスプラットフォームで使用されます)。
さらに、私は user3254289 からの回答を使用しないことを好み、 Maven Invoker を使用するよう提案しています。
質問
質問に対するMariuszSの回答に基づいて、Javaからmavenを実行する方法は?
アプリケーションを次のように構成しました。
pom の依存関係:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-embedder</artifactId>
<version>3.1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-wagon</artifactId>
<version>0.9.0.M2</version>
</dependency>
<dependency>
<groupId>org.apache.maven.wagon</groupId>
<artifactId>wagon-http-lightweight</artifactId>
<version>2.5</version>
</dependency>
https://github.com/mariuszs/maven-cli-exampleから取得した次の(調整された)メソッドを使用
private void executeHbmToJava() {
System.out.println(new File(".").getAbsolutePath());
MavenCli cli = new MavenCli();
cli.doMain(new String[]{"clean", "install"}, ".", System.out, System.out);
// desired is the following
// cli.doMain(new String[]{"hibernate3:hbm2java"}, ".", System.out, System.out);
}
次のエラーが表示されます。
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
Caused by: java.lang.NoSuchMethodError: org.codehaus.plexus.DefaultPlexusContainer.<init>(Lorg/codehaus/plexus/ContainerConfiguration;[Lcom/google/inject/Module;)V
Maven 3.0.4 に基づく NoSuchMethod: ... java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet.copyOf(.. )
MAVEN_HOME 変数に関していくつかのチェックを実行しました。cmd と eclipse の両方で問題なく mvn コマンドを実行できるので、これらの設定は正しいと思います (間違っていたら訂正してください)。
メイヴン
$ mvn -v
Apache Maven 3.3.3 (7994120775791599e205a5524ec3e0dfe41d4a06; 2015-04- 22T13:57:37+02:00)
Maven home: C:\Program Files\Apache Software Foundation\apache-maven-3.3.3\bin\..
Java version: 1.8.0_45, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_45\jre
Default locale: nl_NL, platform encoding: Cp1252
OS name: "windows 8.1", version: "6.3", arch: "amd64", family: "dos"
ジャワ
$ java -version
java version "1.8.0_71"
Java(TM) SE Runtime Environment (build 1.8.0_71-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.71-b15, mixed mode)
このエラーを克服し、Java ランタイムから mvn hibernate3:hbm2java を自動的に起動するという私の目的を達成する方法を知っている人はいますか?
TL;DR
Maven Embedder を使用しているときに java.lang.NoSuchMethodError を修正するにはどうすればよいですか?
Caused by: java.lang.NoSuchMethodError: org.codehaus.plexus.DefaultPlexusContainer.<init> (Lorg/codehaus/plexus/ContainerConfiguration;[Lcom/google/inject/Module;)V
与えられた:
private void executeHbmToJava() {
System.out.println(new File(".").getAbsolutePath());
MavenCli cli = new MavenCli();
cli.doMain(new String[]{"clean", "install"}, ".", System.out, System.out);
// desired is the following
// cli.doMain(new String[]{"hibernate3:hbm2java"}, ".", System.out, System.out);
}