java - Maven Embedder - 运行 hibernate3 :hbm2java programmatically

标签 java hibernate maven maven-embedder

** 更新 **

我尝试重现该错误,并尝试创建一个最小、完整且可验证的示例。不幸的是,即使在执行从头开始技术之后,我什至无法自己重现错误(o my)...

当我手动执行 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”的 MySQL 数据库才能工作。

https://github.com/Weirdfishees/reverse-engineering.git

这是我的配置:

pom:

<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&amp;usessl=false?autoreconnect=true&amp;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?

-- 不可重现 - 但有附加信息 --

简介

各位 stackoverflow 用户,大家好,我有一个关于 Maven Embedder 的使用的问题。

在讨论实际的代码部分之前,我想与您分享我的问题的背景。

我正在构建一个接收用户输入的 GUI 应用程序 (javaFX)。基于此输入,应用程序动态生成两个 hibernate 配置文件(hibernate.cfg.xml 和 reveng.xml)。基于这些配置文件(提供连接详细信息),应用程序所需的以下功能是自动(无需用户交互)对数据库进行逆向工程并创建所有表的 POJO 类(自下而上开发)。

当我手动执行 mvn hibernate3:hbm2java 参数(使用命令行或简单地在 Eclipse 中运行为 -> maven build.. -> goal mvn hibernate3:hbm2java)时,将创建包含我想要的所有类的所需包。

但是,目标是以编程方式执行 mvn hibernate3:hbm2java,而不是手动执行。

研究

我尝试了以下选项:

Running Maven from Java code in Windows?

private void executeHbmToJava() {       
    try {
        Runtime.getRuntime().exec("cmd \\c hibernate3:hbm2java");
    } catch (IOException e) {           
        e.printStackTrace();
    }           
}

这个选项不会抛出任何错误,但是程序中似乎没有发生任何事情(在 Eclipse 中刷新 View 后,所需的类不存在...)

即使此选项有效,由于应用程序的上下文(应用程序将跨平台使用),我更喜欢使用 Maven Embedder。

此外,我更喜欢使用 user3254289 的答案以及使用 Maven Invoker 的建议。

问题

基于 MariuszS 对问题 How to run maven from java? 给出的答案

我的应用程序配置如下:

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命令,因此我认为这些设置是正确的(如果我错了,请纠正我)。

Maven

$ 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

$ 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);
}

最佳答案

我设法解决了这个问题。感谢 Tunaki 提供了最小、完整和可验证示例的链接。通过运用这些技术,我成功地解决了这个问题。

基于 Mykel Alvis 的回答 https://stackoverflow.com/a/30439890 我将我的 pom 调整为以下内容:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.5</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-basic</artifactId>
    <version>1.0.2.v20150114</version>
</dependency>
<dependency>
    <groupId>org.eclipse.aether</groupId>
    <artifactId>aether-transport-wagon</artifactId>
    <version>1.0.2.v20150114</version>
</dependency>
<dependency>
    <groupId>org.apache.maven.wagon</groupId>
    <artifactId>wagon-http</artifactId>
    <version>2.9</version>
</dependency>
<dependency>
    <groupId>org.apache.maven.wagon</groupId>
    <artifactId>wagon-provider-api</artifactId>
    <version>2.9</version>
</dependency>
<dependency>
    <groupId>org.apache.maven.wagon</groupId>
    <artifactId>wagon-http-lightweight</artifactId>
    <version>2.9</version>
</dependency>

此外,我禁用了应用程序这一部分未使用的所有其他依赖项。结合上述依赖项并注释未使用的依赖项解决了该问题。

工作提取版本位于 https://github.com/Weirdfishees/reverse-engineering.git

关于java - Maven Embedder - 运行 hibernate3 :hbm2java programmatically,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35684728/

相关文章:

java - 哪个版本的 Hibernate 是独立的(不需要 JPA 实现)?

java - 同步异步任务的最佳方式

java - java中如何在指定时间内执行任务

java - Hibernate/Spring 4 升级后,ClassCastException Proxy36 无法转换为 SessionImplementor

java - hibernate 验证程序中的异常。嵌套异常是 java.lang.NoClassDefFoundError : ConfigurationImpl

java - 在 Hibernate 中,为什么 Set 是表示多值关联的推荐方式

java - hibernate:根据另一列更新一列

maven - Nexus 找不到项目 pom.xml 的签名

Java Maven 组装插件 编译 fatal error : invalid target release 1. 14

java - 最后的分析失败了。后台任务页面上提供了更多详细信息