2

我正在使用 vertx 服务代理。当我尝试添加所有必需的依赖项和 package-info java 文件时。我仍然得到 vertx 编译错误无法解析为类型。从教程中我了解到它是一个生成的文件,但它不会生成。

pom.xml 如下:

<modelVersion>4.0.0</modelVersion>
<groupId>io.vertx.starter</groupId>
<artifactId>vertx-start-project</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<vertx.version>3.8.3</vertx.version>
<main.verticle>io.vertx.starter.MainVerticle</main.verticle>
</properties>

<dependencyManagement>
<dependencies>
  <dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-stack-depchain</artifactId>
    <version>${vertx.version}</version>
    <type>pom</type>
    <scope>import</scope>
  </dependency>
</dependencies>
</dependencyManagement>

<dependencies>
<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-core</artifactId>
</dependency>
<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-unit</artifactId>
  <scope>test</scope>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web</artifactId>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-web-templ-freemarker</artifactId>
</dependency>
<dependency>
    <groupId>com.github.rjeschke</groupId>
    <artifactId>txtmark</artifactId>
    <version>0.13</version>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-jdbc-client</artifactId>
</dependency>
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <version>2.3.4</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>   
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-service-proxy</artifactId>
</dependency>
<dependency>
    <groupId>io.vertx</groupId>
    <artifactId>vertx-codegen</artifactId>
    <scope>provided</scope>
   </dependency>
  </dependencies>

 <build>
<pluginManagement>
  <plugins>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.5.1</version>
      <configuration>
        <source>1.8</source>
        <target>1.8</target>

        <annotationProcessors>
        <annotationProcessor>io.vertx.codegen.CodeGenProcessor</annotationProcessor>
        </annotationProcessors>
        <generatedSourcesDirectory>${project.basedir}/src/main/generated</generatedSourcesDirectory>
        <compilerArgs>
            <arg>-AoutputDirectory=${project.basedir}/src/main</arg>
        </compilerArgs>
      </configuration>
    </plugin>
    <!-- tag::clean[] -->
    <plugin>
      <artifactId>maven-clean-plugin</artifactId>
      <version>3.0.0</version>
      <configuration>
        <filesets>
          <fileset>
            <directory>${project.basedir}/src/main/generated</directory>
          </fileset>
        </filesets>
      </configuration>
    </plugin>
    <!-- end::clean[] -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-deploy-plugin</artifactId>
      <version>2.8.2</version>
      <configuration>
        <skip>true</skip>
      </configuration>
    </plugin>
    </plugins>
</pluginManagement>

<plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-shade-plugin</artifactId>
    <version>2.4.3</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>shade</goal>
        </goals>
        <configuration>
          <transformers>
            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
              <manifestEntries>
                <Main-Class>io.vertx.core.Launcher</Main-Class>
                <Main-Verticle>${main.verticle}</Main-Verticle>
              </manifestEntries>
            </transformer>
            <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
              <resource>META-INF/services/io.vertx.core.spi.VerticleFactory</resource>
            </transformer>
          </transformers>
          <artifactSet>
          </artifactSet>
          <outputFile>${project.build.directory}/${project.artifactId}-${project.version}-fat.jar</outputFile>
        </configuration>
      </execution>
    </executions>
  </plugin>

  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.5.0</version>
    <configuration>
      <mainClass>io.vertx.core.Launcher</mainClass>
      <arguments>
        <argument>run</argument>
        <argument>${main.verticle}</argument>
      </arguments>
    </configuration>
  </plugin>
</plugins>

数据库服务接口如下:

  @VertxGen
  @ProxyGen
  public interface WikiDatabaseService {

@Fluent
WikiDatabaseService fetchAllPages(Handler<AsyncResult<JsonArray>> resultHandler);

@Fluent
WikiDatabaseService fetchPage(String name, Handler<AsyncResult<JsonObject>> resultHandler);

@Fluent
WikiDatabaseService createPage(String title, String markdown, Handler<AsyncResult<Void>> resultHandler);

@Fluent
WikiDatabaseService savePage(int id, String markdown, Handler<AsyncResult<Void>> resultHandler);

@Fluent
WikiDatabaseService deletePage(int id, Handler<AsyncResult<Void>> resultHandler);

@GenIgnore
static WikiDatabaseService create(JDBCClient dbClient, HashMap <SqlQuery, String> sqlQueries, Handler<AsyncResult<WikiDatabaseService>> readyHandler) {
    return new WikiDatabaseServiceImpl(dbClient, sqlQueries, readyHandler);
}

@GenIgnore
static WikiDatabaseService createProxy(Vertx vertx, String address) {
return new WikiDatabaseServiceVertxEBProxy(vertx, address);
}

 }

包信息如下:

 @ModuleGen(groupPackage = "io.vertx.starter.database", name = "starter-database")
 package io.vertx.starter.database;

 import io.vertx.codegen.annotations.ModuleGen;
4

1 回答 1

1

如果您使用 Eclipse 作为 IDE 来开发使用服务代理的 Vert.X 项目,那么您需要做更多的事情才能生成代码:

1) 在您的WikiDatabaseService接口中注释这些行:

@GenIgnore
static WikiDatabaseService createProxy(Vertx vertx, String address) {
return new WikiDatabaseServiceVertxEBProxy(vertx, address);
}

2) 在 Project Explorer 中右键单击您的 Vert.X 项目,选择Build Path > Configure Build Path
2.1) 选择Source Tab(确保在左侧栏中选择 Java Build Path)
2.2) 单击Add Folder
2.3) 确保在 src/main/ 下检查生成
的文件夹 2.4) 单击确定,然后单击应用/应用并关闭
3) 在 Vert.X 项目文件夹内的终端/cmd(取决于您使用的操作系统)中,执行以下命令:mvn clean package - > 执行此命令是必要的,因为需要为代理类执行代码生成才能使代码正常工作。
4) 在步骤 1) 中取消注释代码并run mvn clean package再次命令
5) 现在尝试通过执行java -jar ./target/name_of_project-fat.jar(在您的情况下应该是java -jar ./target/vertx-start-project-fat.jarORR sh ./redeploy.sh在 Linux 上)来运行您的代码

原因是 Eclipse 与 IntellIJ IDEA 不同,它没有在 CLASSPATH 下拾取生成的文件夹,如此所述:

请注意,生成的代码放在 src/main/generated,一些集成开发环境(如 IntelliJ IDEA)会自动在类路径中提取。

希望能帮助到你。

于 2020-06-09T08:38:41.107 回答