1

我想使用 Java 创建一个预定的网络作业来每天归档一次我的数据。我的计划是尽量减少 webjob 本身的依赖关系,只是简单地对我的主应用程序的运行实例进行 Http 调用,以便它可以处理其余的事情。我遇到的问题是webjob成功上传后,我点击运行,它成功,然后立即失败。只记录成功,所以我完全不知道是什么导致了失败。我希望有更多经验的人可以引导我完成整个过程,以帮助我弄清楚我缺少什么。

Java 代码如下所示:

        HttpURLConnection httpConnection = null;
        Integer responseCode = null;
        try {
            URL serverUrl = new URL(endpoint);

            httpConnection = (HttpURLConnection) serverUrl.openConnection();
            httpConnection.setRequestMethod("GET");

            responseCode = httpConnection.getResponseCode();

            System.out.println("Status: " + responseCode + " - " + httpConnection.getResponseMessage());

            return responseCode;

        } catch (Exception e) {
            if (responseCode != null) {
                System.out.println("Status: " + responseCode + " - " + httpConnection.getResponseMessage());
            }
            e.printStackTrace();
        } finally {
            if (httpConnection != null) {
                httpConnection.disconnect();
            }
        }
        return 400;

简化,但只知道它自己运行得很好。

我的过程是将此代码导出为 jar 文件,然后将 jar 文件与批处理文件一起压缩为 zip。

批处理文件内容如下:

set JAVA_HOME=D:\Program Files (x86)\Java\jdk1.8.0_202
set CLASSPATH=.;%JAVA_HOME%\lib
set PATH=%JAVA_HOME%\bin;%PATH%
java -jar archive-webjob.jar

而且我已经尝试过使用不同的 jdks,1.8.0_202 是最新的。

在其他地方,我看到使用了其他文件,例如 web.config 或 settings.job,但我自己没有看到使用它们有任何区别。

至于我在 Azure 上的设置,always-on 设置为 true,以及 Tomcat 8.5(自动)、Java 1.8(自动)、64 位和最小安全配置。

不幸的是,我很难找到有关如何执行此操作的资源。因此,如果我遗漏了一些明显的东西,请多多包涵。

仅供参考,不幸的是 Azure 功能不适合我,因为我的公司不允许使用 Azure CLI 进行部署,但我确信这将是一个很好的解决方案。

提前感谢您提供任何有用的信息。

4

1 回答 1

1

所以后来日志确实最终详细说明了失败。问题是我压缩了错误的 jar 文件(我在 eclipse 上手动导出的那个),该文件中没有“Main-Class”属性MANIFEST.MF。为了挽救这次遇到困难的任何人,我将继续并清楚地概述我所采取的步骤。

  1. 编写 Java 代码并确保它在本地运行。请注意,一旦上传,您将无法向 localhost 或私有地址(例如 SO)发出请求 - 但您部署的实例端点当然可以工作。

  2. 对我有用的 run.bat 文件实际上如下所示:

set PATH=%PATH%;%JAVA_HOME%/bin
java -jar AppName-Version-jar-with-dependencies.jar 

'jar-with-dependencies' 后缀是以下结果:

  1. Maven 插件(当然,也可以使用 gradle/ant/command line 来做到这一点):
    ...
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.5</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.otherPackages.MainClassName</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin> 
        </plugins>
    </build>

我缺少的关键步骤:如前所述,虽然META-INF/MANIFEST.MF生成了一个文件,但它不包含“Main-Class”属性(尽管上面实现了 maven-assembly-plugin)。

  1. 只需src/main/resources使用以下内容制作文件:
Manifest-Version: 1.0 
Main-Class: com.otherPackages.MainClassName
  1. mvn clean package会在目标文件夹中生成一个AppName-Version-jar-with-dependencies.jar(不需要手动导出为jar),里面会有一个详细的MANIFEST.MF文件,这次包含了Main-Class属性。

  2. AppName-Version-jar-with-dependencies.jar将文件连同文件一起压缩run.bat成 .zip

  3. 将 .zip 文件上传到 Azure,Webjob 应该可以按预期工作。

希望这可以节省一些时间。如果我至少没有记录我一天半的时间试图弄清楚这一点,我会感到内疚。

于 2019-05-21T01:44:17.267 回答