如何制作可执行jar?

时间:2014-03-10 18:22:42

标签: java executable-jar

我正在使用Maven创建一个新的Web应用程序。我从“春天的在线指南”中获得了一些创建数据库的代码。但是出于某种原因,代码永远不会被运行。

在我的pom.xml中,我包含了以下代码:

   <properties>
    <start-class>hello.Application</start-class>    
   </properties>

这是我从春季指南中获得的“应用”课程。

package hello;

 import java.sql.ResultSet;

public class Application {

public static void main(String args[]) {
    // simple DS for test (not for production!)
    SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
    dataSource.setDriverClass(org.h2.Driver.class);
    dataSource.setUsername("sa");
    dataSource.setUrl("jdbc:h2:mem");
    dataSource.setPassword("");

    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

    System.out.println("Creating tables");
    jdbcTemplate.execute("drop table customers if exists");
    jdbcTemplate.execute("create table customers(" +
            "id serial, first_name varchar(255), last_name varchar(255))");

    String[] names = "John Woo;Jeff Dean;Josh Bloch;Josh Long".split(";");
    for (String fullname : names) {
        String[] name = fullname.split(" ");
        System.out.printf("Inserting customer record for %s %s\n", name[0], name[1]);
        jdbcTemplate.update(
                "INSERT INTO customers(first_name,last_name) values(?,?)",
                name[0], name[1]);
    }

    System.out.println("Querying for customer records where first_name = 'Josh':");
    List<Customer> results = jdbcTemplate.query(
            "select * from customers where first_name = ?", new Object[] { "Josh" },
            new RowMapper<Customer>() {
                @Override
                public Customer mapRow(ResultSet rs, int rowNum) throws SQLException {
                    return new Customer(rs.getLong("id"), rs.getString("first_name"),
                            rs.getString("last_name"));
                }
            });

    for (Customer customer : results) {
        System.out.println(customer);
    }
}

}

我的项目结构如下:

项目名称

  • 的src

    • web应用

      • 您好

        • application.java

我对此很新,但我无法理解为什么它找不到application.java文件。 任何想法都将不胜感激。

编辑:这是整个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>embed.tomcat.here</groupId>
 <artifactId>EmbedTomcatNew</artifactId>
 <packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>EmbedTomcatNew Maven Webapp</name>
<url>http://maven.apache.org</url>


  <properties>
    <start-class>hello.Application</start-class>    
</properties>

 <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
  </dependency>
 </dependencies>

 <build>
   <finalName>EmbedTomcatNew</finalName>
   <plugins>
           <plugin>
             <groupId>org.apache.tomcat.maven</groupId>
          <artifactId>tomcat7-maven-plugin</artifactId>
          <version>2.2</version>          
          <configuration>   
            <port>9966</port>
          </configuration>
        </plugin>
   </plugins>

   </build>

  </project>

编辑: 我还应该提一下,它正在运行一个jsp文件 - 其中只有'hello world'打印到浏览器 - 所以它正在运行,但我希望它首先运行java类。

1 个答案:

答案 0 :(得分:1)

WAR

您正在构建.war文件,如<packaging>war</packaging>定义所示,该文件只能部署到Web应用程序容器。没有启动类,并且在stackoverflow上有记录,可以控制大多数Web应用程序容器中的启动顺序。

JAR

您必须将项目更改为可执行文件.jar,并在main配置选项的Manifest中指定jar plugin类。设置一些随机属性不会做任何事情。

您可能希望使用shade插件将所有瞬态依赖项捆绑到一个整体.jar中,否则您手上就会遇到classpath安装噩梦。

这是一个例子,从src/main/webapp目录运行这个是一个糟糕的不可移植的想法,应该作为参数传递。

import java.io.File;
import org.apache.catalina.startup.Tomcat;

public class Main {

    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));

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

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