Guess I figured out a solution for the first question as well - I am
packaging multiple main() classes in the same JAR and specifying entrypoint
classes when submitting the JAR. Most of my issues stemmed from an
improperly configured POM file and a mismatch in Flink runtime versions.
I'll assume this is the recommended way to go about doing this, thanks for
reading and have a great day!

On Mon, Aug 31, 2020 at 12:03 PM Manas Kale <manaskal...@gmail.com> wrote:

> 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
>>
>

Reply via email to