构建一个在Linux服务器上运行的jar

时间:2017-11-12 03:48:27

标签: java linux scala shell apache-spark

我有一个Scala程序,我正在使用Intellij IDE。我创建了一个这个程序的jar并将它放在Linux服务器上。我还制作了一个shell脚本来执行该程序。每当我运行shell脚本时,我都会收到此错误:

  

抛出java.lang.ClassNotFoundException:   com.tac.cco.associations.HDFStoES.main           在java.net.URLClassLoader $ 1.run(URLClassLoader.java:359)           在java.net.URLClassLoader $ 1.run(URLClassLoader.java:348)           at java.security.AccessController.doPrivileged(Native Method)           在java.net.URLClassLoader.findClass(URLClassLoader.java:347)           at java.lang.ClassLoader.loadClass(ClassLoader.java:425)           at java.lang.ClassLoader.loadClass(ClassLoader.java:358)           at java.lang.Class.forName0(Native Method)           at java.lang.Class.forName(Class.java:278)           在org.apache.spark.util.Utils $ .classForName(Utils.scala:229)           在org.apache.spark.deploy.SparkSubmit $ .org $ apache $ spark $ deploy $ SparkSubmit $$ runMain(SparkSubmit.scala:695)           在org.apache.spark.deploy.SparkSubmit $ .doRunMain $ 1(SparkSubmit.scala:187)           在org.apache.spark.deploy.SparkSubmit $ .submit(SparkSubmit.scala:212)           在org.apache.spark.deploy.SparkSubmit $ .main(SparkSubmit.scala:126)           在org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)

这也是我的Shell脚本

loader.sh

#!/bin/bash

input_path=/user/content/dashboard/t_date=
#output_path=/user/content/t_orc_content
lib=/apps/cco/lib
midt_date=20170626
jar_file=/apps/cco/ReportingData/bin/ReportingData.jar

input=$input_path$t_date
args="--jars $lib/elasticsearch-spark-20_2.11-5.2.1.jar,$lib/elasticsearch-5.2.1.jar,$lib/kafka-clients-0.9.0.2.3.4.51-1.jar,$lib/config-1.3.1.jar,$lib/DistributedLogger-0.0.2.jar,$lib/argparse4j-0.7.0.jar,$lib/spark-sql_2.11-2.1.0.jar,$lib/spark-core_2.11-2.1.0.jar"
opt="--driver-memory 30g --executor-memory 20g --executor-cores 10 --num-executors 6 --master yarn --conf spark.hadoop.yarn.timeline-service.enabled=false"

/usr/local/spark/bin/spark-submit $opt $args --class com.tac.cco.associations.HDFStoES.main $jar_file $t_date
exit

该程序的主文件位于src / main / scala / com / tac / cco / associations / HDFStoES / main.scala中,但似乎无法识别它。清单文件位于src / main / META-INF / MANIFEST.MF下,包含以下内容:

Manifest-Version: 1.0
Main-Class: com.tac.cco.associations.HDFStoES.main

我不明白为什么会出现此错误消息而不是程序正在运行。

要创建Jar,我执行了以下操作: 我进入了项目结构 - > artificats - > jar - >来自具有依赖关系的模块 - >然后,我选择了ReportingData(我的项目名称)模块。选择com.tac.cco.associations.HDFStoES.main作为我的主类,然后选择mainfest的目录。然后我删除了除manifest文件夹之外的所有依赖项。然后我创建它,去构建工件,先清理它然后构建它。

1 个答案:

答案 0 :(得分:1)

在pom.xml中添加以下插件

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
  <execution>
    <phase>package</phase>
    <goals>
      <goal>shade</goal>
    </goals>
    <configuration>
      <transformers>
        <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
          <mainClass>com.tac.cco.associations.HDFStoES.main</mainClass>
        </transformer>
      </transformers>
    </configuration>
  </execution>
</executions>
</plugin>