【问题标题】:Java app does not work on command line is fine in eclipseJava应用程序在命令行上不起作用在eclipse中很好
【发布时间】: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 语句发生在下面描述的错误之后。代码从未到达他们手中,这就是他们没有打印的原因。

标签: java eclipse maven-3


【解决方案1】:

我的应用程序的操作取决于对命令行参数的正确处理,而我没有这样做。

这是 RunReports.java 中 main() 的定义:

public static void main(String[] reports)  

在做任何动作之前,我们必须匹配一个命令行参数:

if (reports[0].equals("change_status")) {
   // do something 
}

但由于我错误地设置了命令行,即在 jar 文件之后使用 JVM 参数,它成为了报告 [0] 的一部分。当我弄清楚如何打印到 STDOUT(见上面的评论)时,我能够看到发生了什么。打印我的命令行参数

reports[0]

成功了

-Dgov.ssa.dne.reportdir=C:\temp\ upcoming_changes 

显然不匹配

upcoming_changes

所以这里没有什么神秘的。我需要切换一些东西并根据@lane.maxwell 调整到 C:\temp 的路径,一切正常。

最后的命令行语句

java -Dgov.ssa.dne.reportdir="C:\\temp" -jar dne-caprs.jar upcoming_changes

eclipse中没有出现这个问题的原因如下:

在 Java 应用程序运行配置中,有一个参数选项卡。在 Arguments 选项卡中有一个 VM 部分,我在其中放置了 VM 参数,还有一个 Program Arguments 部分,我在其中放置了程序参数。

由于我在 Eclipse 中正确设置了配置,因此它运行正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多