3

我尝试用scala-maven-plugin 2.4.0.

使用的父 pom 是以下一个,scala.version = 2.12,如果您检查其依赖关系,则具有依赖项org.scala-lang:scala-library:2.12.10,来自Spark-core 2.4.6 。它依赖于另一个只知道如何编译Java源代码的 pom。

<?xml version="1.0" encoding="UTF-8"?>
<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>
    <artifactId>parent-spark</artifactId>
    <packaging>pom</packaging>

    <name>POM Parent pour les projets Spark</name>
    <description>POM Parent pour les projets Spark</description>

    <parent>
        <groupId>fr.comptes.france</groupId>
        <artifactId>parent</artifactId>
        <version>0.0.6-SNAPSHOT</version>
        <relativePath>../Parent-POM</relativePath>
    </parent>

    <dependencies>
        <!-- DAO vers Postgis -->
        <dependency>
            <groupId>fr.comptes.france</groupId>
            <artifactId>dao.postgis</artifactId>
            <version>${project.parent.version}</version>
        </dependency>

        <!-- Spark core et sql --> 
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-core_${scala.version}</artifactId>
            <version>${spark.version}</version>
            <scope>provided</scope>

            <!-- Exclusion de ses loggers -->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>

                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-sql_${scala.version}</artifactId>
            <version>${spark.version}</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-mllib_${scala.version}</artifactId>
            <version>${spark.version}</version>
            <scope>provided</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>4.4.0</version>
                
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                        
                        <configuration>
                            <recompileMode>all</recompileMode>
                            <sourceDir>src/main/scala</sourceDir>
                        </configuration>
                    </execution>
                    
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                        
                        <configuration>
                            <recompileMode>all</recompileMode>
                            <testSourceDir>${project.basedir}/src/test/scala</testSourceDir>
                        </configuration>
                    </execution>
                </executions>
                
                <configuration>
                    <scalaVersion>${scala.version}</scalaVersion>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

编译具有以下内容的项目时:三个Java源文件为
src/main/scala
src/main/java

它以这种方式失败:

[INFO] Building Spark (Datasets) : Registre National des Associations (RNA) 0.0.6-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ spark-dataset-association ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO] Copying 0 resource
[INFO] 
[INFO] --- scala-maven-plugin:4.4.0:compile (scala-compile-first) @ spark-dataset-association ---
[WARNING]  Expected all dependencies to require Scala version: 2.12.0
[WARNING]  org.apache.spark:spark-core_2.12:2.4.6 requires scala version: 2.12.10
[WARNING] Multiple versions of scala libraries detected!
[INFO] /home/marc/dev/Java/comptes-france/metier-et-gestion/dev/SparkDatasetAssociation/src/main/java:-1: info: compiling
[INFO] /home/marc/dev/Java/comptes-france/metier-et-gestion/dev/SparkDatasetAssociation/src/main/scala:-1: info: compiling
[INFO] Compiling 4 source files to /home/marc/dev/Java/comptes-france/metier-et-gestion/dev/SparkDatasetAssociation/target/classes at 1601406402143
[ERROR] error: java.lang.StackOverflowError
[INFO]  at scala.tools.nsc.javac.JavaScanners$JavaScanner.putCommentChar(JavaScanners.scala:580)
[INFO]  at scala.tools.nsc.javac.JavaScanners$JavaScanner.skipBlockComment(JavaScanners.scala:585)
[INFO]  at scala.tools.nsc.javac.JavaScanners$JavaScanner.skipBlockComment(JavaScanners.scala:585)
[INFO]  at scala.tools.nsc.javac.JavaScanners$JavaScanner.skipBlockComment(JavaScanners.scala:585)
[INFO]  at scala.tools.nsc.javac.JavaScanners$JavaScanner.skipBlockComment(JavaScanners.scala:585)
[INFO]  at scala.tools.nsc.javac.JavaScanners$JavaScanner.skipBlockComment(JavaScanners.scala:585)

八个项目中的三个项目遇到了这个问题。

  1. 为什么要scala-maven-plugin尝试编译src/main/java内容?
    我有没有提到我要求它编译Scala源代码src/main/scala

  2. 这个错误可能是什么?
    我的 javadoc 或注释在我的Java源文件中没有问题:所有Eclipse警告都检查了它们,以确保 Javadoc 的正确性。

  3. 以这样的麻烦开始一个Scala / Java混合项目让我觉得Scala编译器无法为这样的工作做好准备。
    它打算以这种方式使用吗?


对于其中一个项目,我找到了一个原因:
这个完全正确的评论:

/*
   Données infra-communales    -     Diplômes - Formation      
   Mise en ligne le 22/10/2019       Géographie au 01/01/2018     
         
   IRIS                    Code du département suivi du numéro de commune ou du numéro d'arrondissement municipal suivi du numéro d'IRIS
   REG                     Code de la région
   DEP                     Code du département
   UU2010                  Code du département ou "00" pour les unités urbaines qui s'étendent sur plusieurs départements voire au-delà de la frontière suivi d'un code sur une position indiquant la taille de la population puis d'un numéro d'ordre à l'intérieur de la taille
   COM                     Code du département suivi du numéro de commune ou du numéro d'arrondissement municipal pour Paris Lyon et Marseille
   LIBCOM                  Libellé de la commune ou de l'arrondissement municipal pour Paris Lyon et Marseille
   TRIRIS                  Code du département suivi d'un numéro d'ordre à l'intérieur du département sur trois positions puis d'un indicateur de TRIRIS
   GRD_QUART               Code du département suivi du numéro de commune ou du numéro d'arrondissement municipal pour Paris Lyon et Marseille suivi du numéro de grand quartier
   LIBIRIS                 Libellé de l'IRIS à l'intérieur de la commune ou de l'arrondissement municipal pour Paris Lyon et Marseille
   TYP_IRIS                Type d'IRIS : habitat (H), activité (A), divers (D), Autre (Z)
   MODIF_IRIS              Type de modification de l'IRIS
   LAB_IRIS                Label de qualité de l'IRIS
   P16_POP0205             Nombre de personnes de 2 à 5 ans
   P16_POP0610             Nombre de personnes de 6 à 10 ans
   P16_POP1114             Nombre de personnes de 11 à 14 ans
   P16_POP1517             Nombre de personnes de 15 à 17 ans
   P16_POP1824             Nombre de personnes de 18 à 24 ans
   P16_POP2529             Nombre de personnes de 25 à 29 ans
   P16_POP30P              Nombre de personnes de 30 ans ou plus
   P16_SCOL0205            Nombre de personnes scolarisées de 2 à 5 ans
   P16_SCOL0610            Nombre de personnes scolarisées de 6 à 10 ans
   P16_SCOL1114            Nombre de personnes scolarisées de 11 à 14 ans
   P16_SCOL1517            Nombre de personnes scolarisées de 15 à 17 ans
   P16_SCOL1824            Nombre de personnes scolarisées de 18 à 24 ans
   P16_SCOL2529            Nombre de personnes scolarisées de 25 à 29 ans
   P16_SCOL30P             Nombre de personnes scolarisées de 30 ans ou plus
   P16_NSCOL15P            Nombre de personnes non scolarisées de 15 ans ou plus
   P16_NSCOL15P_DIPLMIN    Nombre de personnes non scolarisées de 15 ans ou plus titulaires d'aucun diplôme ou au plus un BEPC, brevet des collèges ou DNB
   P16_NSCOL15P_CAPBEP     Nombre de personnes non scolarisées de 15 ans ou plus titulaires d'un CAP ou d'un BEP
   P16_NSCOL15P_BAC        Nombre de personnes non scolarisées de 15 ans ou plus titulaires d'un baccalauréat (général, technologique, professionnel)
   P16_NSCOL15P_SUP        Nombre de personnes non scolarisées de 15 ans ou plus titulaires d'un diplôme de l'enseignement supérieur
   P16_HNSCOL15P           Nombre d'hommes non scolarisés de 15 ans ou plus
   P16_HNSCOL15P_DIPLMIN   Nombre d'hommes non scolarisés de 15 ans ou plus titulaires d'aucun diplôme ou au plus un BEPC, brevet des collèges ou DNB
   P16_HNSCOL15P_CAPBEP    Nombre d'hommes non scolarisés de 15 ans ou plus titulaires d'un CAP ou d'un BEP
   P16_HNSCOL15P_BAC       Nombre d'hommes non scolarisés de 15 ans ou plus titulaires d'un baccalauréat (général, technologique, professionnel)
   P16_HNSCOL15P_SUP       Nombre d'hommes non scolarisés de 15 ans ou plus titulaires d'un diplôme de l'enseignement supérieur
   P16_FNSCOL15P           Nombre de femmes non scolarisées de 15 ans ou plus
   P16_FNSCOL15P_DIPLMIN   Nombre de femmes non scolarisées de 15 ans ou plus titulaires d'aucun diplôme ou au plus un BEPC, brevet des collèges ou DNB
   P16_FNSCOL15P_CAPBEP    Nombre de femmes non scolarisées de 15 ans ou plus titulaires d'un CAP ou d'un BEP
   P16_FNSCOL15P_BAC       Nombre de femmes non scolarisées de 15 ans ou plus titulaires d'un baccalauréat (général, technologique, professionnel)
   P16_FNSCOL15P_SUP       Nombre de femmes non scolarisées de 15 ans ou plus titulaires d'un diplôme de l'enseignement supérieur
 */

对Scala编译器想要查看的外部文件的注释大小是否有限制,即使它们不关心?

它是哪一个?3行,最多4行?

另一方面,似乎(我不确定:我不想删除我的源文件上的评论来检查)这些评论因为太多而被拒绝:

/**
 * Thème des objets sociaux. 
 * @author Marc Le Bihan
 */
public enum ThemeObjetSocial {
   /** Retour à l'emploi. */
   RETOUR_A_EMPLOI("Retour à l'emploi", new String[] {
      "019014", // Lutte contre l'illettrisme
      "019016", // Aide à l'insertion des jeunes
      "019020", // Groupements de chômeurs, aide aux chômeurs
      "019050", // Réinsertion des délinquants
      "019055", // Soutien, reclassement des détenus
      "030000", // Aide à l'emploi, développement local, promotion de solidarités économiques, vie locale
      "030010", // Entreprises d'insertion, associations intermédiaires, régies de quartier
      "030020", // Aide à la création d'activités économiques individuelles
      "030050", // Promotion d'initiatives de développement durable
   }),

   /** Professionnels. */
   PROFESSIONNELS_EMPLOI("Professionnels", new String[] {
      "014025", // Organisation de professions (hors caractère syndical)
      "030005", // Comité, défense d'un emploi
      "030015", // Groupement d'employeurs
   }),

   /** Formations */
   FORMATIONS("Formations", new String[] {
      "015000", // Éducation formation
      "015010", // Organisation de professions enseignantes, amicales de personnel
      "015025", // Associations périscolaires, coopération, aide à l'enseignement
      "015030", // Œuvres sociales en faveur des élèves, œuvres en faveur pupilles de la nation
      "015035", // Organisme de gestion d'établissement d'enseignement général et technique
      "015040", // Organisme de gestion d'établissement d'enseignement supérieur
      "015045", // Établissement de formation professionnelle, formation continue
      "015050", // Centre d'enseignement et de formation associations d’étudiants, d’élèves
      "015087", // Études et formations linguistiques
      "015100", // Apprentissage
   }),

   /** Aspects sociaux liés à l'emploi */
   SOCIAL_EMPLOI("Aspects sociaux liés à l'emploi", new String[] {
      "002005", // Associations philanthropiques
      "002010", // Amicales laïques
      "004010", // Médiation, prévention
      "014000", // Amicales, groupements affinitaires, groupements d'entraide (hors défense de droits fondamentaux)
      "014035", // Groupements d'entraide et de solidarité
      "018030", // Prévention et lutte contre l'alcoolisme, la toxicomanie
      "019000", // Interventions sociales
      "019004", // Aide et conseils aux familles
      "019005", // Associations familiales, services sociaux pour les familles
      "019012", // Lutte contre le surendettement
      "019040", // Aide aux personnes en danger, solitude, désespoir, soutien psychologique et moral
      "020000", // Associations caritatives, humanitaires, aide au développement, développement du bénévolat
      "020005", // Secours financiers et autres services aux personnes en difficulté
      "020010", // Secours en nature, distribution de nourriture et de vêtements
      "020015", // Associations caritatives à buts multiples
      "020020", // Associations caritatives intervenant au plan international
      "021005", // Crèches, garderies, haltes garderies
      "003060", // Activités civiques, information civique
      "030012", // Comités de défense et d'animation de quartier, association locale ou municipale
      "032000", // Logement
      "032510", // Aide au logement
      "032520", // Associations et comités de locataires, de propriétaires, comités de logement
   }),

   /** Soutien publics particules */
   SOUTIEN_PUBLICS_PARTICULIERS("Soutien publics particuliers", new String[] {
      "019025", // Aide aux réfugiés et aux immigrés (hors droits fondamentaux)
      "003020", // Défense des droits des femmes, condition féminine
      "003025", // Défense des droits des personnes homosexuelles
      "003030", // Défense des droits des personnes en situation de handicap
      "003035", // Association pour la défense de droits de minorités
      "003045", // Défense des droits des personnes rapatriées
      "003050", // Défense des droits des personnes étrangères ou immigrées, de personnes réfugiées
      "014050", // Associations féminines pour l'entraide et la solidarité (hors défense de droits fondamentaux)
      "014060", // Associations de personnes homosexuelles pour l'entraide et la solidarité (hors défense de droits fondamentaux)
      "014070", // Associations de personnes en situation de handicap pour l'entraide et la solidarité (hors défense de droits fondamentaux)
      "014080", // Associations de classe d'âge
      "003040", // Lutte contre les discriminations
      "018050", // Aide sociale aux personnes en situation de handicap
      "018015", // Établissements, services pour personnes handicapées (y compris c.a.t)
      "018025", // Établissements et services pour adultes en difficulté, chrs (centres d'hébergement et de réadaptation sociale)
      "018040", // Aide aux accidentés du travail
   }),
   
   /** Développement touristique. */
   DEVELOPPEMENT_TOURISTIQUE("Développement touristique", new String[] {
      "007000", // Clubs de loisirs, relations
      "007040", // Activités festives (soirées...)
      "007080", // Centres de loisirs, clubs de loisirs multiples
      "009010", // Loisirs pour personnes en situation de handicap
      "009020", // Centres aérés, colonies de vacances
      "009025", // Mouvements éducatifs de jeunesse et d'éducation populaire
      "011000", // Sports, activités de plein air
      "011005", // Associations multisports locales
      "011018", // Handisport
      "011125", // Natation - baignade (natation, plongée)
      "011192", // Associations pour la promotion du sport, médailles, mérite sportif
      "011400", // Activités de plein air (dont saut à l'élastique)
      "023045", // Représentation d'intérêts régionaux et locaux
      "024050", // Actions de sensibilisation et d'éducation à l'environnement et au développement durable
      "030012", // Comités de défense et d'animation de quartier, association locale ou municipale
      "030050", // Promotion d'initiatives de développement durable
      "034000", // Tourisme
      "034230", // Gîtes ruraux, camping, caravaning, naturisme
      "034240", // Syndicats d'initiative, offices de tourisme, salons du tourisme
      "036520", // Sauvetage, secourisme, protection civile
   });
   
   /** Liste des codes objets sociaux associés. */
   private String[] codesObjetsSociaux;
   
   /** Libellé de ce thème d'objet social. */
   private String libelle;

   /**
    * Construire un thème d'objet social.
    * @param libelle Libellé du thème.
    * @param codesObjetsSociaux Liste des codes objets sociaux liés.
    */
   private ThemeObjetSocial(String libelle, String[] codesObjetsSociaux) {
      this.libelle = libelle;
      this.codesObjetsSociaux = codesObjetsSociaux;
   }
   
   /**
    * Renvoyer le libellé du thème.
    * @return Libellé.
    */
   public String getLibelle() {
      return this.libelle;
   }
   
   /**
    * Renvoyer la liste des codes objets sociaux.
    * @return Codes objets Sociaux.
    */
   public String[] getCodesObjetsSociaux() {
      return this.codesObjetsSociaux;
   }
   
   /**
    * Renvoyer une liste combinée de plusieurs natures d'objets sociaux.
    * @param themesSociaux Liste des thèmes sociaux désirés.
    * @return Liste des codes sociaux correspondants.
    */
   public static List<String> union(ThemeObjetSocial... themesSociaux) {
      List<String> themes = new ArrayList<>();
      
      for(ThemeObjetSocial theme : themesSociaux) {
         for(String objetSocial : theme.getCodesObjetsSociaux()) {
            themes.add(objetSocial);
         }
      }
      
      return themes;
   }
}

当我开始编写Scala源文件时,我必须遵守哪些注释限制?

没有太多评论,我理解,因为Scala在限制之后无法处理它们,
但是有多少 low ?


我找到了避免错误的解决方法:

<plugin>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>scala-maven-plugin</artifactId>
    <version>4.4.0</version>
    
    <executions>
        <execution>
            <id>scala-compile-first</id>
            <phase>process-resources</phase>
            <goals>
                <goal>compile</goal>
            </goals>
            
            <configuration>
                <recompileMode>all</recompileMode>
                <sourceDir>src/main/scala</sourceDir>
            </configuration>
        </execution>
        
        <execution>
            <id>scala-test-compile</id>
            <phase>process-test-resources</phase>
            <goals>
                <goal>testCompile</goal>
            </goals>
            
            <configuration>
                <recompileMode>all</recompileMode>
                <testSourceDir>${project.basedir}/src/test/scala</testSourceDir>
            </configuration>
        </execution>
    </executions>
    
    <configuration>
         <!-- Go inside spark-core to find scala version used and copy it here -->
        <scalaVersion>2.12.10</scalaVersion>
<!-- instead of 2.12 that was here before -->
    </configuration>
</plugin>

(就像您愿意指定您正在编译Java 1.8.151而不是在编译Java 1.8)。

4

0 回答 0