我正在尝试设置一个 cronjob 来从 iTunes Connect 下载我的每日和每周报告。我已经下载了 Apple 的Autoingestion.class
,并编写了以下 shell 脚本来下载每周报告:
java Autoingestion <MyAccountName> <MyPassword> <MyVendorID> Sales Weekly Summary
此 shell 脚本与 存储在同一个目录中Autoingestion.class
。当我在目录中运行此 shell 脚本时,它运行正常。如果我转到另一个目录并运行它,则会收到以下错误:
Exception in thread "main" java.lang.NoClassDefFoundError: Autoingestion
Caused by: java.lang.ClassNotFoundException: Autoingestion
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:334)
Could not find the main class: Autoingestion. Program will exit.
因为从另一个目录运行时不起作用,所以我的 cronjob 不起作用。
有人知道为什么会发生这种情况以及有什么办法可以消除它吗?
答案1
使用以下脚本:
#!/usr/bin/env bash
cd "$( dirname "$0" )"
java Autoingestion <MyAccountName> <MyPassword> <MyVendorID> Sales Weekly Summary
这会将工作目录更改为脚本的位置,然后执行 Java 程序。
原因可能是隐含的类路径.
。来自man java
:
-cp classpath
Specifies a list of directories, JAR archives, and ZIP archives
to search for class files. Class path entries are separated by
colons (:). Specifying -classpath or -cp overrides any setting
of the CLASSPATH environment variable.
If -classpath and -cp are not used and CLASSPATH is not set, the
user class path consists of the current directory (.).
由于在您当前工作目录中java
找不到(Autoingestion
如果您从其他地方调用该脚本),因此它无法启动。
根据程序的具体行为(例如在当前工作目录中写入文件),您还可以尝试指定适当的-classpath
,例如:
java -cp "$( dirname "$0" )" Autoingestion <MyAccountName> <MyPassword> <MyVendorID> Sales Weekly Summary
答案2
我刚刚遇到了这个错误,原因是我有点愚蠢 - Apple 提供了 Autoingestion.class.zip。我只是在运行该类之前没有解压该类。哎呀!