【发布时间】:2017-01-09 22:05:22
【问题描述】:
很抱歉,标题很笼统,后面的描述很长。提前感谢任何阅读并回答的人。
我有一个应用程序,它接受一个 VM 参数和一个命令行参数。这是一个 Maven 项目。我从 Java 应用程序运行配置在 Eclipse 中运行它。没问题。它创建一个 PDF 文件,并且 System.out() 调用实际上打印到 STDOUT。记录调用打印到 Eclipse 控制台。一切如预期。
当我在 maven 中构建时(我在 Windows 7 上使用 git bash shell):
$ mvn clean compile package
jar 是使用内部的所有依赖项构建的,并包含 persistence.xml 文件。我从命令行运行
$ java -jar target/dne-caprs-reports-0.0.1-SNAPSHOT.jar \
-Dgov.ssa.dne.reportdir=C:\temp\ upcoming_changes
没有错误。万岁。但是……没有 PDF,也没有关于 STDOUT 的消息。 STDOUT 上应该有一些消息。我在整个文件系统中搜索了 PDF,以防它们被意外输出。没有什么。
我将 jar 放到 Linux 机器上并以相同的方式运行它(显然使用不同的 reportdir)并得到相同的结果。没有PDF。没有标准输出。无日志记录(虽然我不知道我是否正确地进行了日志记录)。
所以“不起作用”意味着应用程序似乎运行良好,除了 STDOUT 上没有输出并且没有创建 PDF 文件。而且完全没有错误。
主类:RunReport.java:
package gov.ssa.dne.app;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import gov.ssa.dne.reports.ChangeStatusReport;
import gov.ssa.dne.reports.OpenChangesReport;
import gov.ssa.dne.reports.OpenProblemReport;
import gov.ssa.dne.reports.UpcomingChangesReport;
public class RunReport {
public static void main(String[] reports) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("dne-caprs-reports");
EntityManager em = factory.createEntityManager();
if (reports[0].toString().equals("change_status")) {
ChangeStatusReport report = new ChangeStatusReport(em, "DNE Change Status");
System.out.println("CHANGE STATUS REPORT");
report.generateReport();
}
}
}
ChangeStatusReport.java - 为简洁起见删除了详细信息:
public class ChangeStatusReport {
private EntityManager em;
private List<Sc6cm3rm1> changeList = new ArrayList<Sc6cm3rm1>();
private Cell cell;
private Table table;
private String title;
private static final Logger LOGGER = Logger.getLogger( ChangeStatusReport.class.getName() );
public ChangeStatusReport(EntityManager em, String title) {
this.em = em;
this.title = title;
}
public void generateReport() {
Query q = em.createNativeQuery(NativeQueries.DNE_CHANGE_STATUS, Sc6cm3rm1.class);
changeList = q.getResultList();
createPdf();
}
private void createPdf() {
String reportLocation = System.getProperty("gov.ssa.dne.reportdir");
String report = reportLocation + "DNE_Change_Status_" + DneStyles.reportSdf.format(new Date()) + ".pdf";
try {
PdfWriter writer = new PdfWriter(report);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf, PageSize.A4.rotate());
// Add title
document.add(pdfTitle);
table = new Table(new float[] { 8, 8, 8, 35, 12, 12, 3, 20 });
document.add(table);
document.close();
LOGGER.log(Level.INFO, "report complete " + report);
} catch (Exception e) {
e.printStackTrace();
}
}
}
pom.xml
<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>gov.ssa.dne.nmst</groupId>
<artifactId>dne-caprs-reports</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>dne-caprs-reports</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<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>gov.ssa.dne.app.RunReport</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.IncludeResourceTransformer">
<resource>META-INF/persistence.xml</resource>
<file>src/main/java/META-INF/persistence.xml</file>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<LONG LIST OF DEPENDENCIES REMOVED>
</dependencies>
</project>
这里发生了什么?我已经阅读了解决 STDOUT 问题的其他答案,但这些问题与试图将 jar 作为可执行文件运行但没有“java -jar”部分的人有关。我不这样做。它与我的 Maven 构建有关吗?我如何运行它?我想不出还有什么可以改变的。
【问题讨论】:
-
看起来您在 Windows 机器上运行,但可能使用 bash 提示符?目录参数看起来很奇怪,您是否尝试过 -Dgov.ssa.dne.reportdir=C:\\temp\\upcoming_changes (转义反斜杠,在即将到来之前删除空格)
-
没有标准输出是很奇怪的。如果你用一个简单的“hello world”替换main,它应该只是“工作”......当你遮蔽它时......减少你的问题集,看看你是否可以在扩展它之前得到一些基本的工作。你绝对应该看到一些东西。
-
@lane.maxwell 我在 Windows 上使用“git bash”外壳。这些都是伟大而简单的建议。谢谢你们俩。显然我已经看这个太久了!我从第二个建议开始。果然是一个简单的java jar,它只打印“Hello world!”。到 STDOUT 实际上就是这样做的。我将从那里继续,并将发布我发现的任何内容。
-
STDOUT 与脑死亡问题有关的问题——见答案。我的 sysout 语句发生在下面描述的错误之后。代码从未到达他们手中,这就是他们没有打印的原因。