2016-01-22 342 views
0

我正在嘗試使用答案here以便在IntelliJ Idea Community Edition中從Oracle運行this example。我創建了一個新項目,複製了示例中的源代碼並在Idea中啓用了Maven支持。我能夠製作並運行項目,但無法訪問瀏覽器中的服務。 Tomcat一直在扔404。請注意,源代碼和pom.xml文件未經改動。從IntelliJ Idea Community Edition運行嵌入式Tomcat時出現問題

的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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.example.employees</groupId> 
    <artifactId>employees-app</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 
    <name>employees-app Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
     <tomcat.version>7.0.57</tomcat.version> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-core</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-logging-juli</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat.embed</groupId> 
      <artifactId>tomcat-embed-jasper</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>tomcat-jasper</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>tomcat-jasper-el</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.tomcat</groupId> 
      <artifactId>tomcat-jsp-api</artifactId> 
      <version>${tomcat.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>jstl</groupId> 
      <artifactId>jstl</artifactId> 
      <version>1.2</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <finalName>employees-app</finalName> 
     <resources> 
      <resource> 
       <directory>src/main/webapp</directory> 
       <targetPath>META-INF/resources</targetPath> 
      </resource> 
     </resources> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.3.2</version> 
       <inherited>true</inherited> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 

      </plugin>   
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <configuration> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
        <finalName>employees-app-${project.version}</finalName> 
        <archive> 
         <manifest> 
          <mainClass>com.example.employees.Main</mainClass> 
         </manifest> 
        </archive> 
       </configuration> 
       <executions> 
        <execution> 
         <phase>package</phase> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

使用進程監視器,我已經能夠確定的Tomcat相關網站的根目錄(本地主機:8080)與MyProject的\目標\類。如果我在那裏放置一個虛擬txt文件,我可以通過瀏覽器訪問它(例如localhost:8080/test.txt)。

'classes'目錄不是空的。它包含兩個子目錄:

  1. COM /例子/員工/ *類 - 所有的類文件
  2. META-INF /資源/ [家居/主/ src目錄/ Web應用程序在Oracle example ]

我的預感是輸出的文件夾層次結構有問題。我不知道是什麼或如何解決它。有任何想法嗎?

+0

您是否嘗試按官方[doc](http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/basic_app_embedded_tomcat/basic_app-tomcat-embedded.html#section9 )?從命令行(在mvn clean package後),從目標文件夾運行:java -jar employees-app-1.0-SNAPSHOT -jar -with-dependencies.jar然後檢查localhost:8080 –

+0

不,我沒有。目標是能夠使用IntelliJ來完成Tomcat開發。 –

回答

0

我想通了。

正如鏈接的帖子所示,最好使用Heroku的啓動器和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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.heroku.sample</groupId> 
    <artifactId>embeddedTomcatSample</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <name>embeddedTomcatSample Maven Webapp</name> 
    <url>http://maven.apache.org</url> 
    <properties> 
    <tomcat.version>8.0.28</tomcat.version> 
    </properties> 
    <dependencies> 
    ...tomcat & other deps... 
    </dependencies> 
    <build> 
    <finalName>embeddedTomcatSample</finalName> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>appassembler-maven-plugin</artifactId> 
      <version>1.1.1</version> 
      <configuration> 
       <assembleDirectory>target</assembleDirectory> 
       <programs> 
        <program> 
         <mainClass>launch.Main</mainClass> 
         <name>webapp</name> 
        </program> 
       </programs> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>assemble</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

該發射器功能做了大部分的魔術通過編程配置Tomcat到項目的目錄內運行。

public static void main(String[] args) throws Exception { 

     String webappDirLocation = "src/main/webapp/"; 
     Tomcat tomcat = new Tomcat(); 

     //The port that we should run on can be set into an environment variable 
     //Look for that variable and default to 8080 if it isn't there. 
     String webPort = System.getenv("PORT"); 
     if(webPort == null || webPort.isEmpty()) { 
      webPort = "8080"; 
     } 

     tomcat.setPort(Integer.valueOf(webPort)); 

     StandardContext ctx = (StandardContext) tomcat.addWebapp("/", new File(webappDirLocation).getAbsolutePath()); 
     System.out.println("configuring app with basedir: " + new File("./" + webappDirLocation).getAbsolutePath()); 

     // Declare an alternative location for your "WEB-INF/classes" dir 
     // Servlet 3.0 annotation will work 
     File additionWebInfClasses = new File("target/classes"); 
     WebResourceRoot resources = new StandardRoot(ctx); 
     resources.addPreResources(new DirResourceSet(resources, "/WEB-INF/classes", 
       additionWebInfClasses.getAbsolutePath(), "/")); 
     ctx.setResources(resources); 

     tomcat.start(); 
     tomcat.getServer().await(); 
    } 

我無法弄清楚如何以編程設置路徑到Tomcat的的conf文件夾但我能夠克服這得益於this answer。在正常情況下,Tomcat負責設置初始上下文。因此,webapp的context.xml文件中的環境變量會在初始上下文中結束。幸運的是,可以通過自定義的InitialContextFactory來複制它。