很多时候,我们需要对编写的程序进行打包,这个时候,我们可以借助一些项目构建工具,如maven, sbt, ant等,这里我使用的是maven。

打包成可执行有主类的jar包(jar包中无依赖)

以下是配置打包成可执行,带主类的jar包:

  1. <project>
  2. ...
  3. <build>
  4. <plugins>
  5. <plugin>
  6. <groupId>org.apache.maven.plugins</groupId>
  7. <artifactId>maven-jar-plugin</artifactId>
  8. ...
  9. <configuration>
  10. <archive>
  11. <manifest>
  12. <addClasspath>true</addClasspath>
  13. <mainClass>fully.qualified.MainClass</mainClass> <!-- 你的主类名 -->
  14. </manifest>
  15. </archive>
  16. </configuration>
  17. ...
  18. </plugin>
  19. </plugins>
  20. </build>

But, 虽然现在把程序打包成了jar文件,也可以运行,但是,这个jar包是没有包含依赖的,因此,如果这个程序有其他依赖,那么在运行这个程序的时候,需要指定类目录,并且要把所有的依赖都放到类目录下去,手动添加依赖到类目录下,简直就是恶梦。。。

我曾经就这么干过,它少一个依赖,我就手动加一个到类目录,少一个,加一个,少一个,加一个,当我加了大概有10几个之后,而且还看不到尽头。。。简直要疯的节奏,然后想起之前用sbt打包,也是可以把依赖添加到jar包,心情顿时好转,赶紧google,于是找到google到了maven的官网…。顺便说一下,虽然我们google的时候,会搜索到很多结果,但很多时候,我们最好选择合适的结果进行阅读,我的一般顺序是:官方优先,StackExchange。。。

打包成带依赖的jar包

配置

不加main类而带依赖的jar包

编辑pom.xml文件,内容如下:

  1. <project>
  2. [...]
  3. <build>
  4. [...]
  5. <plugins>
  6. <plugin>
  7. <artifactId>maven-assembly-plugin</artifactId>
  8. <version>3.0.0</version>
  9. <configuration>
  10. <descriptorRefs>
  11. <descriptorRef>jar-with-dependencies</descriptorRef>
  12. </descriptorRefs>
  13. </configuration>
  14. <executions>
  15. <execution>
  16. <id>make-assembly</id> <!-- this is used for inheritance merges -->
  17. <phase>package</phase> <!-- bind to the packaging phase -->
  18. <goals>
  19. <goal>single</goal>
  20. </goals>
  21. </execution>
  22. </executions>
  23. </plugin>
  24. [...]
  25. </project>

加main类也带依赖的jar包

编辑pom.xml文件,内容如下:

  1. <project>
  2. <build>
  3. <plugins>
  4. <!--(start) for package jar with dependencies -->
  5. <plugin>
  6. <artifactId>maven-assembly-plugin</artifactId>
  7. <version>3.0.0</version>
  8. <configuration>
  9. <archive>
  10. <manifest>
  11. <mainClass>Main</mainClass>
  12. </manifest>
  13. </archive>
  14. <descriptorRefs>
  15. <descriptorRef>jar-with-dependencies</descriptorRef>
  16. </descriptorRefs>
  17. </configuration>
  18. <executions>
  19. <execution>
  20. <id>make-assembly</id> <!-- this is used for inheritance merges -->
  21. <phase>package</phase> <!-- bind to the packaging phase -->
  22. <goals>
  23. <goal>single</goal>
  24. </goals>
  25. </execution>
  26. </executions>
  27. </plugin>
  28. <!--(end) for package jar with dependencies -->
  29. </plugins>
  30. </build>
  31. </project>

值得注意的是,不要像以下那样修改pom.xml文件,那样虽然不会报错,但生成的jar包中的MANIFEST.MF中没有主类,这样的jar包无法直接运行。

  1. <project>
  2. [...]
  3. <build>
  4. [...]
  5. <plugins>
  6. <plugin>
  7. <groupId>org.apache.maven.plugins</groupId>
  8. <artifactId>maven-jar-plugin</artifactId>
  9. ...
  10. <configuration>
  11. <archive>
  12. <manifest>
  13. <addClasspath>true</addClasspath>
  14. <mainClass>fully.qualified.MainClass</mainClass> <!-- 你的主类名 -->
  15. </manifest>
  16. </archive>
  17. </configuration>
  18. ...
  19. </plugin>
  20. <plugin>
  21. <artifactId>maven-assembly-plugin</artifactId>
  22. <version>3.0.0</version>
  23. <configuration>
  24. <descriptorRefs>
  25. <descriptorRef>jar-with-dependencies</descriptorRef>
  26. </descriptorRefs>
  27. </configuration>
  28. <executions>
  29. <execution>
  30. <id>make-assembly</id> <!-- this is used for inheritance merges -->
  31. <phase>package</phase> <!-- bind to the packaging phase -->
  32. <goals>
  33. <goal>single</goal>
  34. </goals>
  35. </execution>
  36. </executions>
  37. </plugin>
  38. [...]
  39. </project>

打包

使用以下命令打包:

  1. mvn package

就像官方网站说的,” this is pretty simple! “


然而,当在运行操作hdfs的jar包时,我出现了以下问题:

  1. Exception in thread "main" java.io.IOException: No FileSystem for scheme: hdfs
  2. at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2660)
  3. at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
  4. at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:94)
  5. at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2703)
  6. at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2685)
  7. at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:373)
  8. at sentry.magic.fs.Dfs.<init>(Dfs.java:20)
  9. at sentry.magic.fs.CheckFlumeIsCompleted.<init>(CheckFlumeIsCompleted.java:26)
  10. at Main.main(Main.java:26)

好在有位仁兄[2]也遇到了这个问题,从而使得问题解决。解决方法如下:

  1. FileSystem dfs = null;
  2. Configuration conf = new Configuration();
  3. public Dfs(URI uri) throws IOException {
  4. // 必须有下面这一句
  5. conf.set("fs.hdfs.impl","org.apache.hadoop.hdfs.DistributedFileSystem");
  6. // 必须有上面那一句
  7. dfs = FileSystem.get(uri,conf);
  8. }

除了他之种方法之外,我也自己摸索出了一种方法,经过实践,也是可行的,我的方法如下: 
找到打包好的jar包,然后使用归档管理器打开这个jar包,即“open with archive manager”,找到META-INFO/services目录,再找到这个目录下的org.apache.Hadoop.fs.FileSystem文件,编辑这个文件,在文件末尾加上一行:

  1. org.apache.hadoop.hdfs.DistributedFileSystem

但是,这么修改jar的方法,不太合适,因为每生成一次,需要修改一次,所以,建议暂时使用前面那种解决方法。

参考文献:

[1] https://maven.apache.org/plugins/maven-assembly-plugin/usage.html 
[2] http://www.cnblogs.com/justinzhang/p/4983673.html

使用Maven对JAVA程序打包-带主类、带依赖【转】的更多相关文章

  1. 使用Maven对JAVA程序打包-带主类、带依赖

    使用Maven对JAVA程序打包-带主类.带依赖 http://blog.csdn.net/strongyoung88/article/details/54097830

  2. Java程序打包成jar包

    方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] ...

  3. 用命令行将Java程序打包为jar文件

    如何把写好的Java程序打包为jar文件呢?有两种方式可以选择 1.命令行的方式: 打包jar cf JAR文件名称 程序文件名称或者程序所在的文件夹举例:jar cf MyApp.jar D:Jav ...

  4. JAVA程序打包成exe文件详细图解

    我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: eclipse ...

  5. install4j 工具为java程序打包exe

    用 install4j 工具为java程序打包exe 制作人:mark 制作时间:2013-05-02 用Eclipse 将程序源码打包成jar文件. 打包jar方法我不做介绍了,相信大家都会,不会的 ...

  6. Maven将java项目打包生成可运行jar

    Maven将java项目打包生成可运行jar Maven插件配置 <plugins> <plugin> <groupId>org.apache.maven.plug ...

  7. Java程序打包成exe可执行文件

    前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 准备: ecl ...

  8. Java连接MySQL数据库。编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计。

    题目2:编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计.之后,可根据显示的内容进行某条记录的删除(以id为条 ...

  9. 编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容

    题目1:编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容--"chen","wang",&q ...

随机推荐

  1. PLSQL Developer启动失败

    原因:和打印服务冲突 禁掉打印服务,不过打印功能是不行了

  2. linux shell 脚本攻略学习11--mkdir和touch命令详解

    一.创建目录(mkdir命令详解) amosli@amosli-pc:~/learn$ mkdir dir amosli@amosli-pc:~/learn/dir$ mkdir folder amo ...

  3. 重写Checkbox 改写选择框的大小

    /* 作者:Starts_2000 * 日期:2009-07-30 * 网站:http://www.csharpwin.com CS 程序员之窗. * 你可以免费使用或修改以下代码,但请保留版权信息. ...

  4. Android——检测TXT文件中是否含有双字节字符

    在读取双字节字符时,主要涉及到编码的选取: public static boolean isRightfulTXT(File f) { // TODO Auto-generated method st ...

  5. Php廖雪峰教程学习与实战

    https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000 目录 Python教程 Pyth ...

  6. Hadoop相关项目Hive-Pig-Spark-Storm-HBase-Sqoop

    Hadoop相关项目Hive-Pig-Spark-Storm-HBase-Sqoop的相关介绍. Hive Pig和Hive的对比 摘要: Pig Pig是一种编程语言,它简化了Hadoop常见的工作 ...

  7. Redis踩过的坑

    现象:在使用redis云提供的redis服务后,经常出现connect timeout: redis.clients.jedis.exceptions.JedisConnectionException ...

  8. 页面生命周期里面还有很东西,如PageHandlerFactory等等这些东东也够吃一壶的,发现每走到一个领域,发现要学的东西实在是太多太多啦,总感觉自己所学的东西只是沧海一粟,走过了这道坎,又是一片海洋,我只能呐喊:生命永不止息,学海无涯----够用就好。

    页面生命周期里面还有很东西,如PageHandlerFactory等等这些东东也够吃一壶的,发现每走到一个领域,发现要学的东西实在是太多太多啦,总感觉自己所学的东西只是沧海一粟,走过了这道坎,又是一片 ...

  9. .NET压缩图片保存 .NET CORE WebApi Post跨域提交 C# Debug和release判断用法 tofixed方法 四舍五入 (function($){})(jQuery); 使用VUE+iView+.Net Core上传图片

    .NET压缩图片保存   需求: 需要将用户后买的图片批量下载打包压缩,并且分不同的文件夹(因:购买了多个用户的图片情况) 文章中用到了一个第三方的类库,Nuget下载 SharpZipLib 目前用 ...

  10. Android adjustresize全屏无效问题

    屏模式下,即使将activity的windowSoftInputMode的属性设置为:adjustResize,在键盘显示时它未将Activity的Screen向上推动,所以你Activity的vie ...