2019-05-10 EasyWeb打包成Jar运行遇到的问题

1.使用Eclipse的Maven命令打包,老是出错,没法打包成jar

解决方法:在项目根目录下使用命令行 mvn clean install 进行打包

优化方法:项目根目录下创建一个bat文件,文件内容为 mvn clean install;这样每次需要打包点击一下即可

2.打包成jar后运行报表,获取报表模板文件失败,原因是jar里面没有文档路径,所以通过路径方式获得输入流无效,以下列举几种获得路径的代码

1 /* 方式1取模板文件 打包成jar失效 jasperPath=classpath:xxx */
2 String path = URLDecoder.decode(ResourceUtils.getURL(jasperPath).getPath(),"UTF-8");
3 File file = new File(path);
4 FileInputStream inputStream = new FileInputStream(file);
1 /* 方式2取模板文件 打包成jar失效 jasperPath=classpath:xxx */
2 File file = ResourceUtils.getFile(jasperPath);
3 FileInputStream inputStream = new FileInputStream(file);
1 /* 方式3取模板文件 jasperPath=classpath:xxx */
2 Resource res = new ClassPathResource(jasperPath.replace("classpath:", ""));
3 InputStream inputStream = res.getInputStream();
1 /* 方式4取模板文件 jasperPath=classpath:xxx */
2 InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(jasperPath.replace("classpath:", ""));
1 /* 方式5取模板文件 jasperPath=classpath:xxx */
2 InputStream inputStream = JasperReportUtils.class.getClass().getResourceAsStream(jasperPath.replace("classpath:", "/"));

目前我只测试了方式1、2不能访问,方式3是可以的,其他的还没测

3.jasperreport报表主从报表,主报表里面需要设置从报表的路径,原来的是设置的固定的,所以会找不到从报表模板

①通过java代码设置参数值parameters.put("SUBREPORT_DIR", "主报表模板的上级路径");

②检查主报表内是否含有SUBREPORT_DIR参数,如果没有就自己加上(据说增加subreport组件时候会加上,但是我找了下没有,所以自己加上)

③设置subreport的subreportExpression

1 <subreportExpression><![CDATA[ $P{SUBREPORT_DIR} + "order-detail.jasper"]]></subreportExpression>

4.由于第2个问题说了不能在jar包中获得路径,所以也就没办法在第3个问题中设置主报表上级路径了;只能把报表模板放到jar包外,我这里是与jar包同级

通过模板生成报表的代码如下:

 1 /**
 2      * 使用JavaBean填充打印PDF到Html中
 3      * @param request
 4      * @param response
 5      * @param jasperPath 例如:classpath:jasper/report2.jasper
 6      * @param list JavaBean数据
 7      * @param parameters
 8      * @throws Exception
 9      */
10     public static void printPdf2HtmlByJavaBean(HttpServletRequest request, HttpServletResponse response,String jasperPath,Map<String, Object> parameters,List<?> list) throws Exception{
11
12         ServletOutputStream outputStream = response.getOutputStream();
13
14
15         //获取报表的编译文件,后面要将对其进行填充数据
16         InputStream inputStream = null;
17         try {// 如果不在jar包内,就能找到文件
18             String path = URLDecoder.decode(ResourceUtils.getURL(jasperPath).getPath(),"UTF-8");
19             File file = new File(path);
20             inputStream = new FileInputStream(file);
21             parameters.put("SUBREPORT_DIR", file.getPath().replace(file.getName(), ""));
22         }catch(Exception e) {// 否则需要去jar包外找
23             String dirPath = FileCopyUtils.getCurrentDirPath()+File.separator;
24             String path = dirPath +jasperPath.replace("classpath:", "");
25             try {
26                 File file = new File(path);
27                 inputStream = new FileInputStream(file);
28                 parameters.put("SUBREPORT_DIR", file.getPath().replace(file.getName(), ""));
29             }catch(Exception e1) {
30                 throw new RuntimeException(path+"不存在", e1);
31             }
32         }
33
34
35         //由于没有数据,故这里使用空参数和空数据源,该方法需要抛出JRException异常
36         JasperRunManager.runReportToPdfStream(inputStream, outputStream, parameters , new JRBeanCollectionDataSource(list));
37
38         // 输出PDF
39         response.setContentType("application/pdf");
40
41         // 关闭资源
42         outputStream.flush();
43         outputStream.close();
44         inputStream.close();
45
46     }

15-32行代码是通过是否获取不到文件来判断是不是代码位于jar包内,如果在jar包内,则去同级目录查找资源,否则就去resource下查找,都查找不到就抛出异常提醒

获得jar包同级路径的代码如下:

 1  /**
 2      * 获取项目所在文件夹的绝对路径
 3      * @return
 4      */
 5     public static String getCurrentDirPath() {
 6         URL url = FileCopyUtils.class.getProtectionDomain().getCodeSource().getLocation();
 7         String path = url.getPath();
 8         if(path.startsWith("file:")) {
 9             path = path.replace("file:", "");
10         }
11         if(path.contains(".jar!/")) {
12             path = path.substring(0, path.indexOf(".jar!/")+4);
13         }
14
15         File file = new File(path);
16         path = file.getParentFile().getAbsolutePath();
17         return path;
18     }

5.更改数据库配置为生产服务器配置后,本地打包会报错;这是由于启动了测试代码,通过pom配置跳过测试即可

1 <properties>
2         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
3         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
4         <java.version>1.8</java.version>
5         <skipTests>true</skipTests>
6 </properties>

6.方便启动项目,在jar包同级目录下增加startup.bat并放置命令

1 java -jar XXX.jar

以后可以把jre环境也一起放置进去,然后增加命令行,这样就不要安装JDK,配置环境变量了

原文地址:https://www.cnblogs.com/WongHugh/p/10844241.html

时间: 2024-10-09 00:57:33

2019-05-10 EasyWeb打包成Jar运行遇到的问题的相关文章

【深入JAVA】程序打包成Jar包运行并读取外部配置文件

在阅读的过程中有任何问题,欢迎一起交流 邮箱:[email protected] QQ:1494713801 一.程序设置 Java的main方法有个初始化入参args,将参数表示为配置文件的路径,代码如下: 1 public static void main(String[] args) { 2 loadConf(args[0]); 3 } 1 public static void loadConf(String path) throws Exception { 2 Properties pr

【Java】Java程序打包成jar包在Linux上运行

当需要把在Windows上开发的Java程序用在Linux上运行时,就需要吧该Java程序打包成jar包上传到Linux上去运行. 1.Java程序用MyEclipse打包成可运行的jar包 (1)在MyEclipse中选中需要打包的项目,点击右键,选择:Export... 如下图所示: (2)然后在弹出的窗口中选择:Java-->Runnable JAR file,然后点击:Next,如下图所示: (3)然后选择需要打包的程序和保存的地方,然后点击:Finish,如下图所示: 这样Java程序

java项目打包成可运行的jar,main方法带参数

转载    侵联删!!! 原文地址:http://www.cnblogs.com/neillee/p/6063808.html#commentform 将 java 项目打包成可运行的 jar 包(main 函数带参数),并上传到 linux 服务器上运行 一.概述 java项目有两种架构,一种是 B/S 架构的,一种是 C/S 架构的.对于 B/S 架构来说,我们常见的 java ee 即是 B/S 架构,通常,开发人员会在本地进行开发,然后将项目打包成 war 文件,上传至服务器,供调用.而

使用maven 将springboot 应用打包成jar并运行

使用maven 将springboot 应用打包成jar并运行 使用maven将springboot应用打包成一个jar并且运行,需要执行以下几步: 第一步:在springboot的pom.xml中添加maven插件 <!--这个插件,可以将应用打包成一个可执行的jar包--> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spri

使用Gradle将Maven库打包成Jar

项目需要将Dropwizard(Java RESTful服务)与Derby(轻量数据库)打包成Jar然后提供给其他工程使用,由于Dropwizard并未提供jar-release版本,所以写了个gradle构建脚本用于将maven库中的Dropwizard与Derby整合打包成一个jar包,然后再添加到目标项目中使用. 脚本代码: apply plugin: 'java' project.ext { // 项目标题名称 title = 'DropwizardDerby' // 项目名称前缀 ba

【hadoop】 eclipse中的“run on hadoop”和打包成jar提交任务的区别

eclipse中的 调试运行 及 “run on hadoop”默认只是运行在单机上的,因为要想在集群中让程序分布式运行还要经历上传类文件.分发到各个节点等过程, 一个简单的“run on hadoop”只是启动了本地hadoop类库来运行你的程序而已, 在Hadoop cluster的web管理页面(http://192.168.2.2:8088/cluster/apps)上是看不到任何作业信息的,因为你的作业根本就没有运行在集群上. 打包成jar方法: rm tmp/* cp xmlpars

java代码打包成jar以及转换为exe

教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有不爽.此篇博客教你如何方便快捷地把java代码,打包成jar文件以及转换为exe可执行文件 2.前言: 我们都知道Java可以将二进制程序打包成可执行jar文件,双击这个jar和双击exe效果是一样一样的,但感觉还是不同.其实将java程序打包成exe也需要这个可执行jar文件. 3.准备: 下载e

[Java] Java 打包成jar包 和 解压jar包

解压jar包 jar xf xxx.jar 打包成jar包 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 选项包括:     -c  创建新的归档文件     -t  列出归档目录     -x  解压缩已归档的指定(或所有)文件     -u  更新现有的归档文件     -v  在标准输出中生成详细输

java程序打包成jar包

方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 选项包括:    -c  创建新的归档文件    -t  列出归档目录    -x  解压缩已归档的指定(或所有)文件    -u  更新现有的归档文件    -v  在标准输出中生成详细输出    -f  指定归档文件名    -m  包含指定清单文件中的清