Maven: construir código Scala y código Java juntos en un tarro de grasa

soapergem:

Tengo un proyecto Scala que construyo en un tarro de grasa. Hoy me tenía que añadir algunas clases de Java para el proyecto, pero ahora mi construcción Maven está fallando.

La estructura de mi proyecto apariencia (más o menos) como esto:

.
├── src
│   └── main
│       ├── resources
│       │   └── Log4j.properties
|       ├── java
│       │   └── com
│       │       └── myorg
│       │           └── myproject
│       │               └── MyPublicJavaClass.java
│       └── scala
│           └── com
│               └── myorg
│                   └── myproject
│                       └── spark
│                           └── Main.scala
└── pom.xml

Y esto es lo que mi archivo POM se ve así:

<?xml version="1.0"?>
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <name>myproject</name>
  <url>http://maven.apache.org</url>

  <groupId>com.myorg</groupId>
  <artifactId>myproject</artifactId>
  <packaging>jar</packaging>
  <version>0.1.0-RELEASE</version>

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <encoding>UTF-8</encoding>
    <scala.tools.version>2.11</scala.tools.version>
    <scala.version>2.11.8</scala.version>
    <spark.version>2.4.0</spark.version>
    <aws.sdk.version>1.11.553</aws.sdk.version>
  </properties>

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

    <plugins>
      <!-- I added this plugin today to try and make it compile the Java code -->
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <phase>generate-sources</phase>
            <configuration>
              <sources>
                <source>src/main/java</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>

      <!-- This compiles the Scala code -->
      <plugin>
        <groupId>org.scala-tools</groupId>
        <artifactId>maven-scala-plugin</artifactId>
        <version>2.15.2</version>
        <executions>
          <execution>
            <goals>
              <goal>compile</goal>
              <goal>testCompile</goal>
            </goals>
          </execution>
        </executions>
      </plugin>

      <!-- This builds the fat JAR -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.myorg.myproject.spark.Main</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-core_${scala.tools.version}</artifactId>
      <version>${spark.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-sql_${scala.tools.version}</artifactId>
      <version>${spark.version}</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-core</artifactId>
      <version>${aws.sdk.version}</version>
    </dependency>
    <dependency>
      <groupId>com.amazonaws</groupId>
      <artifactId>aws-java-sdk-dynamodb</artifactId>
      <version>${aws.sdk.version}</version>
    </dependency>
    <dependency>
      <groupId>com.amazon.emr</groupId>
      <artifactId>emr-dynamodb-hadoop</artifactId>
      <version>4.8.0</version>
    </dependency>
    <dependency>
      <groupId>com.github.scopt</groupId>
      <artifactId>scopt_${scala.tools.version}</artifactId>
      <version>3.7.1</version>
    </dependency>
    <dependency>
      <groupId>org.apache.logging.log4j</groupId>
      <artifactId>log4j-scala</artifactId>
      <version>11.0</version>
      <type>pom</type>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Antes de agregar la clase de Java, junto con el build-helper-maven-plugindía de hoy, Maven fue capaz de construir este proyecto sin ningún problema. Pero ahora, parece que no he configurado correctamente ese plugin, o tal vez no lo estoy usando la correcta?

Mi código Scala está tratando de utilizar un objeto de tipo MyPublicJavaClasspor lo que ahora los errores de generación que veo en Maven tener este aspecto:

[ERROR] ~ / src / main / Scala / com / myorg / miproyecto / chispas / Main.scala: 227: Error: No se ha encontrado: MyPublicJavaClass tipo

...

[ERROR] Error al ejecutar el meta-herramientas org.scala: scala-maven-plugin: 2.15.2: compilación (por defecto) el proyecto myproject: envoltura: org.apache.commons.exec.ExecuteException: Proceso salió con un error: 1 (valor de salida: 1) -> [Ayuda 1]

Pensé que el build-helper-maven-plugindiría que añadir el directorio principal del código Java a la lista de fuentes para generar antes de tiempo de compilación, pero al parecer no. ¿Cómo puedo arreglar esto?

norbjd:

Está utilizando un plugin muy antiguo para su compilación Scala (última versión 2.15.2han sido liberados 6 Feb 2011 ).

Te sugiero primero en actualizar a un plugin más reciente, como la scala-maven-plugin(última versión 4.0.2el 11 de mayo 2019).

A continuación, puede encontrado un ejemplo con fuentes de Scala / Java mixtos en los documentos . No hay necesidad de utilizar build-helper-maven-plugin, en este caso, ni a configurar sourceDirectoryy testSourceDirectory. Marque esta sencilla pom.xmlcon este plugin (solo he quitado las dependencias no utilizados del ejemplo que nos ha proporcionado cuando reproduje el problema a nivel local):

<?xml version="1.0"?>
<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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <name>myproject</name>
  <url>http://maven.apache.org</url>

  <groupId>com.myorg</groupId>
  <artifactId>myproject</artifactId>
  <packaging>jar</packaging>
  <version>0.1.0-RELEASE</version>

  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <encoding>UTF-8</encoding>
    <scala.tools.version>2.11</scala.tools.version>
    <scala.version>2.11.8</scala.version>
  </properties>

  <build>
    <plugins>
      <plugin>
        <groupId>net.alchim31.maven</groupId>
        <artifactId>scala-maven-plugin</artifactId>
        <version>4.0.2</version>
          <executions>
            <execution>
              <id>scala-compile-first</id>
              <phase>process-resources</phase>
              <goals>
                <goal>add-source</goal>
                <goal>compile</goal>
              </goals>
            </execution>
            <execution>
              <id>scala-test-compile</id>
              <phase>process-test-resources</phase>
              <goals>
                <goal>testCompile</goal>
              </goals>
          </execution>
        </executions>
      </plugin>

      <!-- This builds the fat JAR -->
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>com.myorg.myproject.spark.Main</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
        <executions>
          <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
              <goal>single</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

  <dependencies>
    <dependency>
      <groupId>org.scala-lang</groupId>
      <artifactId>scala-library</artifactId>
      <version>${scala.version}</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=232852&siteId=1
Recomendado
Clasificación