Hi, I solved my second issue - I was not following Maven's convention for placing source code (I had not placed my source in src/main/java). However, I still would like some help with my first question - what is the recommended way to set a project with multiple main() classes? At the end, I would like to be able to run each main() class as a separate job. Should I create a single JAR and specify different entrypoint classes each time or should I create separate JARs for each main() class?
On Mon, Aug 31, 2020 at 11:13 AM Manas Kale <manaskal...@gmail.com> wrote: > Hi, > I have an IntelliJ project that has multiple classes with main() > functions. I want to package this project as a JAR that I can submit to the > Flink cluster and specify the entry class when I start the job. Here are my > questions: > > - I am not really familiar with Maven and would appreciate some > pointers/examples. From what I understand, I will need to use some sort of > transformer in the Maven shade plugin to merge all of the classes. *If > this is correct, can I see a small example? * > - Also, I can't get a single main class working: > > > <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> > > <groupId>flink_summarization</groupId> > <artifactId>flink_summarization</artifactId> > <version>0.1</version> > <packaging>jar</packaging> > > <name>Flink Quickstart Job</name> > <url>http://www.myorganization.org</url> > > <properties> > <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> > <flink.version>1.10.1</flink.version> > <java.version>1.8</java.version> > <scala.binary.version>2.11</scala.binary.version> > <maven.compiler.source>${java.version}</maven.compiler.source> > <maven.compiler.target>${java.version}</maven.compiler.target> > </properties> > > <repositories> > <repository> > <id>apache.snapshots</id> > <name>Apache Development Snapshot Repository</name> > > <url>https://repository.apache.org/content/repositories/snapshots/</url> > <releases> > <enabled>false</enabled> > </releases> > <snapshots> > <enabled>true</enabled> > </snapshots> > </repository> > </repositories> > > <dependencies> > <!-- Apache Flink dependencies --> > <!-- These dependencies are provided, because they should not be > packaged into the JAR file. --> > <!-- https://mvnrepository.com/artifact/org.apache.flink/flink-jdbc --> > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-java</artifactId> > <version>${flink.version}</version> > <scope>provided</scope> > </dependency> > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-streaming-java_${scala.binary.version}</artifactId> > <version>${flink.version}</version> > <scope>provided</scope> > </dependency> > > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-connector-kafka_2.11</artifactId> > <version>${flink.version}</version> > </dependency> > > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-state-processor-api_2.11</artifactId> > <version>${flink.version}</version> > <scope>provided</scope> > </dependency> > > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-connector-jdbc_2.11</artifactId> > <version>1.11.0</version> > </dependency> > > <!-- Add logging framework, to produce console output when running in > the IDE. --> > <!-- These dependencies are excluded from the application JAR by > default. --> > <dependency> > <groupId>org.slf4j</groupId> > <artifactId>slf4j-log4j12</artifactId> > <version>1.7.7</version> > <scope>runtime</scope> > </dependency> > <dependency> > <groupId>log4j</groupId> > <artifactId>log4j</artifactId> > <version>1.2.17</version> > <scope>runtime</scope> > </dependency> > > <!-- Test dependencies--> > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-test-utils_${scala.binary.version}</artifactId> > <version>${flink.version}</version> > <scope>test</scope> > </dependency> > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-runtime_2.11</artifactId> > <version>${flink.version}</version> > <scope>test</scope> > <classifier>tests</classifier> > </dependency> > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-streaming-java_2.11</artifactId> > <version>${flink.version}</version> > <scope>test</scope> > <classifier>tests</classifier> > </dependency> > <dependency> > <groupId>org.assertj</groupId> > <artifactId>assertj-core</artifactId> > <!-- use 2.9.1 for Java 7 projects --> > <version>3.16.1</version> > <scope>test</scope> > </dependency> > > > </dependencies> > > <build> > <plugins> > > <!-- Java Compiler --> > <plugin> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-compiler-plugin</artifactId> > <version>3.1</version> > <configuration> > <source>${java.version}</source> > <target>${java.version}</target> > </configuration> > </plugin> > > <!-- We use the maven-shade plugin to create a fat jar that contains > all necessary dependencies. --> > <!-- Change the value of <mainClass>...</mainClass> if your program > entry point changes. --> > <plugin> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-shade-plugin</artifactId> > <version>3.0.0</version> > <!-- author = Manas - dependencyReducedPOM was disabled to stop > maven from entering an infinite loop --> > <configuration> > <createDependencyReducedPom>false</createDependencyReducedPom> > </configuration> > <executions> > <!-- Run shade goal on package phase --> > <execution> > <phase>package</phase> > <goals> > <goal>shade</goal> > </goals> > <configuration> > <artifactSet> > <excludes> > <exclude>org.apache.flink:force-shading</exclude> > <exclude>com.google.code.findbugs:jsr305</exclude> > <exclude>org.slf4j:*</exclude> > <exclude>log4j:*</exclude> > </excludes> > </artifactSet> > <filters> > <filter> > <!-- Do not copy the signatures in the META-INF > folder. > Otherwise, this might cause SecurityExceptions > when using the JAR. --> > <artifact>*:*</artifact> > <excludes> > <exclude>META-INF/*.SF</exclude> > <exclude>META-INF/*.DSA</exclude> > <exclude>META-INF/*.RSA</exclude> > </excludes> > </filter> > </filters> > <transformers> > <transformer > implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> > > <mainClass>iu.feature_summarization.basic_features.pre.BasicPreProcessJob</mainClass> > </transformer> > > </transformers> > </configuration> > </execution> > </executions> > </plugin> > </plugins> > > <pluginManagement> > <plugins> > > <!-- This improves the out-of-the-box experience in Eclipse by > resolving some warnings. --> > <plugin> > <groupId>org.eclipse.m2e</groupId> > <artifactId>lifecycle-mapping</artifactId> > <version>1.0.0</version> > <configuration> > <lifecycleMappingMetadata> > <pluginExecutions> > <pluginExecution> > <pluginExecutionFilter> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-shade-plugin</artifactId> > <versionRange>[3.0.0,)</versionRange> > <goals> > <goal>shade</goal> > </goals> > </pluginExecutionFilter> > <action> > <ignore/> > </action> > </pluginExecution> > <pluginExecution> > <pluginExecutionFilter> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-compiler-plugin</artifactId> > <versionRange>[3.1,)</versionRange> > <goals> > <goal>testCompile</goal> > <goal>compile</goal> > </goals> > </pluginExecutionFilter> > <action> > <ignore/> > </action> > </pluginExecution> > </pluginExecutions> > </lifecycleMappingMetadata> > </configuration> > </plugin> > </plugins> > </pluginManagement> > </build> > > <!-- This profile helps to make things run out of the box in IntelliJ --> > <!-- Its adds Flink's core classes to the runtime class path. --> > <!-- Otherwise they are missing in IntelliJ, because the dependency is > 'provided' --> > <profiles> > <profile> > <id>add-dependencies-for-IDEA</id> > > <activation> > <property> > <name>idea.version</name> > </property> > </activation> > > <dependencies> > <dependency> > <groupId>org.apache.flink</groupId> > <artifactId>flink-java</artifactId> > <version>${flink.version}</version> > <scope>compile</scope> > </dependency> > <dependency> > <groupId>org.apache.flink</groupId> > > <artifactId>flink-streaming-java_${scala.binary.version}</artifactId> > <version>${flink.version}</version> > <scope>compile</scope> > </dependency> > </dependencies> > </profile> > </profiles> > > </project> > > > The fully qualified name within tag <mainClass> is correct and contains > the main() method. However, when I submit this to Flink I get the error: > > ../../flink-1.11.0/bin/flink run target/flink_summarization-0.1.jar > > ------------------------------------------------------------ > The program finished with the following exception: > > org.apache.flink.client.program.ProgramInvocationException: The program's > entry point class ' > iu.feature_summarization.basic_features.pre.BasicPreProcessJob' was not > found in the jar file > . > > *Am I specifying some <scope> tag incorrectly in my pom file?* > > > Thank you, > Manas >