【问题标题】:Spring Boot Application is not WorkingSpring Boot 应用程序不工作
【发布时间】:2018-06-25 15:47:13
【问题描述】:

我正在关注这个 wiki 来学习 SpringBoot,每当我尝试运行 .war 文件时,它都会出现 404 错误。这是我在系统上创建的文件。

build.xml

<?xml version="1.0"?>

    <project name="HelloSpringBoot" basedir="." default="usage">
    <property file="build.properties"/>

    <property name="src.dir" value="src"/>
    <property name="web.dir" value="war"/>
    <property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
    <property name="test.dir" value="test"/>
    <property name="name" value="HelloSpringBoot"/>

    <path id="master-classpath">
        <fileset dir="${web.dir}/WEB-INF/lib">
            <include name="*.jar"/>
        </fileset>
        <!-- We need the servlet API classes: -->
        <!--  * for Tomcat 5/6 use servlet-api.jar -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="servlet*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
    </path>

    <target name="usage">
        <echo message=""/>
        <echo message="${name} build file"/>
        <echo message="-----------------------------------"/>
        <echo message=""/>
        <echo message="Available targets are:"/>
        <echo message=""/>
        <echo message="build     --> Build the application"/>
        <echo message="deploy    --> Deploy application as directory"/>
        <echo message="deploywar --> Deploy application as a WAR file"/>
        <echo message="start-webapp   --> Start application in Tomcat"/>
        <echo message="stop-webapp    --> Stop application in Tomcat"/>
        <echo message="deploy-webapp     --> Deploy application in Tomcat"/>
        <echo message="undeploy-webapp      --> Undeploy application in Tomcat"/>
        <echo message="list      --> List Tomcat applications"/>
        <echo message=""/>
    </target>

    <target name="build" description="Compile main source tree java files">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}"  debug="true"
               deprecation="false" optimize="false" failonerror="true">
            <src path="${src.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>

    <target name="buildtests" description="Building All TestCases">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" source="1.5" target="1.5" debug="true"
               deprecation="false" optimize="false" failonerror="true">
            <src path="${test.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>

    <target name="clean" description="Cleaning All build files">
        <delete>
            <fileset dir="${build.dir}">
                <include name="**/*.class"/>
            </fileset>
        </delete>
    </target>

    <target name="tests" depends="build,buildtests" description="Running All TestCases">
        <junit printsummary="on" fork="false" haltonfailure="false" failureproperty="tests.failed"
               showoutput="true">
            <classpath refid="master-classpath"/>
            <formatter type="brief" usefile="false"/>

            <batchtest>
                <fileset dir="${build.dir}">
                    <include name="**/*Tests.*"/>
                </fileset>
            </batchtest>
        </junit>

        <fail if="tests.failed">
            tests.failed=${tests.failed}
            ***********************************************************
            ***********************************************************
            ****  One or more tests failed!  Check the output ...  ****
            ***********************************************************
            ***********************************************************
        </fail>
    </target>

    <target name="deploy" depends="build" description="Deploy application">
        <copy todir="${deploy.path}/${name}" preservelastmodified="true">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </copy>
    </target>

    <target name="deploywar" depends="build" description="Deploy application as a WAR file">
        <war destfile="${name}.war"
             needxmlfile="false">
            <fileset dir="${web.dir}">
                <include name="**/*.*"/>
            </fileset>
        </war>
        <copy todir="${deploy.path}" preservelastmodified="true">
            <fileset dir=".">
                <include name="*.war"/>
            </fileset>
        </copy>
    </target>

    <!-- ============================================================== -->
    <!-- Tomcat tasks - remove these if you don't have Tomcat installed -->
    <!-- ============================================================== -->

    <path id="catalina-ant-classpath">
        <!-- We need the Catalina jars for Tomcat -->
        <!--  * for other app servers - check the docs -->
        <fileset dir="${appserver.lib}">
            <include name="catalina-ant.jar"/>
            <include name="tomcat-coyote.jar"/>
            <include name="tomcat-util.jar"/>
        </fileset>
        <fileset dir="${appserver.home}/bin">
            <include name="tomcat-juli.jar"/>
        </fileset>
    </path>

    <taskdef name="catalina-deploy" classname="org.apache.catalina.ant.DeployTask" classpathref="catalina-ant-classpath"/>
    <taskdef name="catalina-list" classname="org.apache.catalina.ant.ListTask" classpathref="catalina-ant-classpath"/>
    <taskdef name="catalina-reload" classname="org.apache.catalina.ant.ReloadTask" classpathref="catalina-ant-classpath"/>
    <taskdef name="catalina-findleaks" classname="org.apache.catalina.ant.FindLeaksTask" classpathref="catalina-ant-classpath"/>
    <taskdef name="catalina-resources" classname="org.apache.catalina.ant.ResourcesTask" classpathref="catalina-ant-classpath"/>
    <taskdef name="catalina-start" classname="org.apache.catalina.ant.StartTask" classpathref="catalina-ant-classpath"/>
    <taskdef name="catalina-stop" classname="org.apache.catalina.ant.StopTask" classpathref="catalina-ant-classpath"/>
    <taskdef name="catalina-undeploy" classname="org.apache.catalina.ant.UndeployTask" classpathref="catalina-ant-classpath"/>

    <target name="start-webapp" description="Start application in Tomcat">
        <catalina-start url="${tomcat.manager.url}"
                        username="${tomcat.manager.username}"
                        password="${tomcat.manager.password}"
                        path="/${name}" />
    </target>

    <target name="stop-webapp" description="Stop application in Tomcat">
        <catalina-stop url="${tomcat.manager.url}"
                 username="${tomcat.manager.username}"
                 password="${tomcat.manager.password}"
                 path="/${name}" />
    </target>

    <target name="deploy-webapp" description="Deploy application in Tomcat">
        <catalina-deploy url="${tomcat.manager.url}"
                username="${tomcat.manager.username}"
                password="${tomcat.manager.password}"
                path="/${name}"
                war="file:${deploy.path}/${name}.war"/>
    </target>

    <target name="undeploy-webapp" description="Undeploy Tomcat application">
        <catalina-undeploy url="${tomcat.manager.url}"
               username="${tomcat.manager.username}"
               password="${tomcat.manager.password}"
               path="/${name}"/>
    </target>

    <target name="list" description="List Tomcat applications">
        <catalina-list url="${tomcat.manager.url}"
              username="${tomcat.manager.username}"
              password="${tomcat.manager.password}"/>
    </target>

    <target name="reload" description="Reload Application in Tomcat">
        <catalina-reload url="${tomcat.manager.url}"
                         username="${tomcat.manager.username}"
                         password="${tomcat.manager.password}"
                         path="/${name}"/>
    </target>

    <!-- End Tomcat tasks -->

    </project>

Greetings.java

package main.java.POJO;


    public class Greetings {
        private final long id;
        private final String name;

        public Greetings(final long id, final String name) {
            this.id = id;
            this.name = name;
        }

        public long getId(final long id) {
            return this.id;
        }

        public String getName(final long name) {
            return this.name;
        }
    }

GreetingController

package main.java.Controller;

    import main.java.POJO.Greetings;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;

    import java.util.concurrent.atomic.AtomicLong;



    @RestController
    public class GreetingController {
        private static final String template = "Hello %s";
        private final AtomicLong atomicLong = new AtomicLong();

        @RequestMapping("/greeting")
        public Greetings greeting(@RequestParam(value = "name", defaultValue = "World")String name) {
            return new Greetings(atomicLong.incrementAndGet(), String.format(template, name));
        }
    }

Application.Java

package main.java.Application;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;

    @SpringBootApplication(scanBasePackages = {"src.main.java.Controller", "src.main.java.POJO"})
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

我有 Springframework5.0.2 和 SpringBoot-1.5.9 和 SpringBoot-AutoConfig-1.5.9、jackson-core 和 jackson-all、servlet、junit 的所有 jars

请帮我解决这个问题。

编辑: 我在我的控制台上运行这个命令:

$ ant build deploy deploywar reload
  Buildfile: /Users/Blah/Projects/SpringLearning/HelloSpringBoot/build.xml

 build:
[javac] /Users/Blah/Projects/SpringLearning/HelloSpringBoot/build.xml:46: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 1 source file to /Users/Blah/Projects/SpringLearning/HelloSpringBoot/war/WEB-INF/classes

build:
[javac] /Users/Blah/Projects/SpringLearning/HelloSpringBoot/build.xml:46: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

  deploy:
 [copy] Copying 76 files to /usr/local/Cellar/tomcat/8.5.24/libexec/webapps/HelloSpringBoot

build:
[javac] /Users/Blah/Projects/SpringLearning/HelloSpringBoot/build.xml:46: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds

  deploywar:
  [war] Building war: /Users/Blah/Projects/SpringLearning/HelloSpringBoot/HelloSpringBoot.war
 [copy] Copying 1 file to /usr/local/Cellar/tomcat/8.5.24/libexec/webapps
 reload:
 [catalina-reload] OK - Reloaded application at context path [/HelloSpringBoot]

【问题讨论】:

  • 您尝试访问的确切 URL 是什么?启动应用程序时来自控制台的日志也会显示出来。最后,作为一般提示,学习 Maven 或 Gradle 可能是个好主意;除非您真的知道自己在做什么,否则将 Ant 用于新项目是一个非常糟糕的主意。
  • 您好,感谢您的快速回复。我试过这些网址链接到现在localhost:8080/greetinglocalhost:8080/HelloSpringBoot/greeting
  • 好吧,我读到了关于 ant 的文章,我知道 ant 在做什么,我用相同的 build.xml 创建了其他 Spring 项目,它工作正常,所以我不认为 ant 真的有这里有问题。
  • 是的,没有看到控制台的构建和运行输出,很难知道还有什么问题。如果部署按计划进行,这两个 URL 之一应该是正确的,因为您将 WAR 文件命名为 HelloSpringBoot.war 并且您在 deploy-war 中提供的路径是 /HelloSpringBoot(通过将属性 name 扩展为 HelloSpringBoot) .所以它不工作的事实几乎肯定会在控制台上显示一条错误消息。

标签: java spring rest tomcat spring-boot


【解决方案1】:

Spring Boot 设计为作为可执行 JAR 文件运行(因此存在 public static void main(String[] args)。然后 Spring Boot 将启动嵌入式 Web 服务器并处理其余部分。如果要部署 Spring Boot 应用程序,则需要添加一些支持类来实现这一点。查看说明here.

【讨论】:

    【解决方案2】:

    @SpringBootApplication(scanBasePackages = {"src.main.java.Controller", "src.main.java.POJO"})

    基础包在我看来不合适,看来您的课程在:

    package main.java.Controller;package main.java.Application;

    有什么理由让您更愿意维护一个复杂的 Ant 文件和 Spring Boot 依赖项,您还必须下载所有可传递的依赖项而不是使用 MavenGraddle

    【讨论】:

    • 嘿,蚂蚁没有任何具体的原因,我只是在学习它。我尝试使用不同的 basePackages 但仍然出现相同的错误。我还尝试查看日志,根本没有错误。
    • 如果您在学习过程中不需要Ant,您介意使用Maven吗?
    猜你喜欢
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2018-10-25
    • 2018-06-04
    • 1970-01-01
    • 2018-06-07
    相关资源
    最近更新 更多