I attempt to compile a mixed Java / Scala project with scala-maven-plugin 2.4.0
.
The parent pom used is the one following, scala.version = 2.12, with dependency org.scala-lang:scala-library:2.12.10
, coming from Spark-core 2.4.6 if you check its dependencies.
It relies on another pom who knows only how to compile Java sources.
<?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>
When compiling a project having :
src/main/scala
empty
src/main/java
with three Java sources files
It fails this way :
[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)
Three projects among eight suffer this trouble.
Why does
scala-maven-plugin
attempt to compilesrc/main/java
content ?
Haven't I mentioned that I was asking it to compile Scala sources fromsrc/main/scala
?What this error can be ?
My javadoc or comments are ok in my Java sources file : they are checked by all the Eclipse warnings available for Javadoc correctness.Beginning a Scala / Java mixed project with such trouble makes me feel that Scala compiler could not be ready for such work.
Is it intended to be used this way ?
For one of the projects, I found a cause :
This perfectly correct comment :
/*
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
*/
Is there a limitation on comment size that has to be respected on foreign files that Scala compiler wants to see even if it is not concerned by them ?
Which is it ? 3 lines, 4 lines maximum ?
For another, it seems (by I'm unsure : I don't want to remove the comments on my source file to check) that these comments who are refused because they are too numerous :
/**
* 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;
}
}
When I will start to write Scala sources files, what are the comment limitations that I will have to respect ?
Not too much comments, I understand, because Scala cannot handle them after a limit,
but how many low ?
I've found a workaround to avoid the errors :
<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>
(Like if you were willing to specify that you are compiling in Java 1.8.151
and not in Java 1.8
).