Java 应用程序无法在命令行上运行,但在 Eclipse 中正常

标签 java eclipse maven-3

对于非常笼统的标题和接下来的详细描述,我们深表歉意。预先感谢任何阅读本文并回答的人。

我有一个需要 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 上应该有一些消息。我在整个文件系统中搜索了 PDF,以防它们被输出到意外的地方。没有什么。

我将 jar fted 到 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构建有关系吗?我如何运行它?我想不出还有什么可以改变的。

最佳答案

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

这是 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 中正确设置了配置,因此它运行正确。

关于Java 应用程序无法在命令行上运行,但在 Eclipse 中正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41557764/

相关文章:

java - 在 LinearLayout 之间添加空间

java - Eclipse for Java Swing 中的结果不一致

java - 如何与其他开发者共享 Java 项目?

maven - 激活资源过滤后编码错误

java - 如何默认跳过集成测试,但仍然在多模块 Maven 项目中按需运行它们?

maven-2 - Maven 命令列出生命周期阶段以及绑定(bind)目标?

java - 初始创建后将文本文件重新加载到数据库中

java - 创建套件时如何让 Eclipse 识别 JUnit 测试?

java - JLabel 中图像的旋转 - Java

java - 获取动态生成的java类的源代码