手动编译并运行Java项目实现过程解析

  现在Java开发基本上就是IDE调试,如果跨平台打个jar包过去运行一般就可以了,但是有些情况比如需要引入外部依赖的时候,这个时候是不能直接运行的,还需要引入一些外部的参数,并不是简单的javac和java的关系了,下面来详细说一下

  一般情况下,在本地都是使用eclipse开发工具进行开发,很多东西基本上就不用我们考虑了,如果我们要将项目放到Linux下运行的话,那么就需要进行转移的操作,当然有Maven、Ant这样的自动化部署工具,简直是太方便了,为了做到更进一步认识的话,我们纯手动的去打包一个java的项目

  首先,项目名称为JarTest,在eclipse结构如下图所示:

  

  包名和类名都看的非常清楚了,App是主类,包含有main方法;TestBean是一个JavaBean实体;TestService是一个利用TestBean进行简单计算的类,那么各个类的代码如下:

App.java

package net.javatest.package1;

import java.util.ArrayList;
import java.util.List;

import net.javatest.package2.TestBean;
import net.javatest.package3.TestService;

public class App {

  public static void main(String[] args) {
    List<TestBean> tb = new ArrayList<TestBean>();
    String[] names = {"hacker","nginx","github","hadoop","storm","solr","kafka","spark"};
    for(int i = 0;i < names.length;i++) {
      tb.add(new TestBean(String.valueOf(i),names[i]));
    }
    List<String> namelist = TestService.nameList(tb);
    for(int i = 0;i < namelist.size();i++) {
      System.out.println(namelist.get(i));
    }
  }

}

TestBean.java

package net.javatest.package2;

public class TestBean {
  private String id;
  private String name;

  public TestBean() {

  }

  public TestBean(String id, String name) {
    this.id = id;
    this.name = name;
  }

  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

TestService.java

package net.javatest.package3;

import java.util.ArrayList;
import java.util.List;

import net.javatest.package2.TestBean;

public class TestService {

  public static List<String> nameList(List<TestBean> tbs) {
    List<String> names = new ArrayList<String>();
    for(TestBean tb : tbs) {
      names.add(tb.getName());
    }
    return names;
  }

}

  文件就是这样,源程序都不依赖于外部包,其实在eclipse中自动已经进行编译成class了,我们可以直接使用class文件,在这里我们直接使用源文件进行编译,首先打包上传项目,压缩成JarTest.zip上传到服务器,

  

  接下来解压释放目录:

unzip JarTest.zipcd JarTest/src

  因为我们打包项目的时候打包的项目外层目录,所以解压出来需要进入JarTest这个目录,我们的源代码文件在src中,现在开始编译:

javac net/javatest/package1/App.java net/javatest/package2/TestBean.java net/javatest/package3/TestService.java

  这样回车之后,没任何提示就编译好了,现在每个包下都有一个和源文件对应的class文件,如果感觉上面太长太麻烦,可以使用通配符全部搞定编译:

javac net/javatest/package*/*.java

  这样就全部编译完了,现在我们可以执行一下看一下运行结果,

java net.javatest.package1.App

  这样就可以直接App的main方法了,接下来可以进行打包,打成一个jar包,用起来更方便,我们可以用eclipse打成jar包看一下目录结构,我们会发现jar包如果解压出来之后,会看到META-INF的一个目录,这个目录中有一个MANIFEST.MF文件,这个文件就是定义如何导入外部jar包以及主类的存在位置,接下来我们自己编写MANIFEST.MF这个文件,我们使用命令:vim MANIFEST.MF创建一个文件,直接在当前也就是src目录下创建即可,然后我们编辑以下内容:

Manifest-Version: 1.0
Main-Class: net.javatest.package1.App

  第一行是固定格式,定义版本号,第二行就是指明主类的位置可以用空格分开多个声明,注意冒号之后要有一个空格;然后注意的就是后面需要空出2行,输入两次换号即可,然后我们保存退出,执行下面命令打包:

jar -cvfm jartest.jar MANIFEST.MF net/

  其中jartest.jar就是要打的包,net就是我们的包目录,现在我们就可以看到一个jartest.jar这样一个文件,

  然后我们执行下面命令就可以运行该jar文件了

java -jar jartest.jar

  如果jar包中具有多个包含main方法的类时,需要指定Main-Class定义的其中之一,命令如下:

java -jar jartest.jar net.javatest.package1.App

  以上是没有任何外部依赖的Java项目的运行,如果有其他依赖的话,具体运行情况如下,我们将刚才打好的jar包下载,然后新建另外一个项目去调用jar包里面类中的方法,项目如下:

  

  只有一个主类,代码很简单,就是调用了jartest.jar的方法,JarTest2.java代码如下:

package net.javatest;

import java.util.ArrayList;
import java.util.List;

import net.javatest.package2.TestBean;
import net.javatest.package3.TestService;

public class JarTest2 {

  public static void main(String[] args) {
    List<TestBean> tb = new ArrayList<TestBean>();
    String[] names = {"test2","nginx","hbase","hadoop","storm","solr","kafka","spark"};
    for(int i = 0;i < names.length;i++) {
      tb.add(new TestBean(String.valueOf(i),names[i]));
    }
    List<String> namelist = TestService.nameList(tb);
    for(int i = 0;i < namelist.size();i++) {
      System.out.println(namelist.get(i));
    }
  }

}

  这时候将jartest.jar导入项目的path里面,编译的时候就不会出错了,我们继续上传该项目,进行编译,编译命令如下:

javac -classpath ../lib/jartest.jar: net/javatest/JarTest2.java

  导入多个外部jar包时需要用:分割,并且最后一个后面必须有冒号,-classpath参数用于指定外部jar包和类文件都可以,运行的时候也需要进行包含,运行命令如下:

java -classpath ../lib/jartest.jar: net.javatest.JarTest2

  接下来将项目打包,打包之前同样执行vim MANIFEST.MF编辑文件如下:

Manifest-Version: 1.0
Main-Class: net.javatest.JarTest2
Class-Path: lib/jartest.jar

  这里第三行导入外部jar包文件,多个文件依赖用空格分隔,目录无所谓这里是相对于打包后jar文件的目录,就是说lib目录和打包后的jar文件在一个目录即可正常运行,接下来打包:

jar -cvfm jartest2.jar MANIFEST.MF net/

  打包后直接使用java -jar jattest.jar是不能执行的,需要将刚才的lib复制过来才可以,执行下面命令:

cd ..cp -r lib/ src/

  复制刚才的lib目录过来即可,现在执行java -jar jartest2.jar即可正常运行了

  综合来说,对于一个复杂的项目,编译以及运行时除了系统类库的支持,还需要引入外部jar包或者类文件才能保证整个项目的正常运行,具体的执行流程需要不断地去熟悉

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • MAC 系统如何使用 Sublime Text 2 直接编译运行 java 代码

    修改 /Users/$username/Library/Application Support/Sublime Text 2/Packages/Java/JavaC.sublime-build 为: 复制代码 代码如下: {  "cmd": ["java", "$file_base_name"],  "file_regex": "^ *\\[javac\\] (.+):([0-9]+):() (.*)$",

  • Java环境配置与编译运行详解

    一.开篇 通过对之前Java之路的了解之后,相信初学者们都对Java有了一个比较深印象的了解了.但是事情不能总停留在理论层面,还得多多实现,才能见真知.我觉得,学习一样东西,要遵循理论--实践--理论这样一个套路.先了解事情的基本概念,弄懂基本概念后,要想方设法的用到生活的点点滴滴上,这样能加深理论的记忆以及发现自己的盲点.在重复的实践中,我们会逐渐对其有了自己的看法.想法,对理论有了一定的深化.最后回归理论,总结出自己的东西,这样东西就真正的属于你了.所以,今天我们要开始动手配Java环境,以

  • java编译时与运行时概念与实例详解

    Java编译时与运行时很重要的概念,但是一直没有明晰,这次专门博客写明白概念. 基础概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字节码,.另外还有啥链接器.汇编器.为了了便于理解我们可以统称为编译器) 那编译时就是简单的作一些翻译工作,比如检查老兄你有没有粗心写错啥关键字了啊.有啥词法分析,语法分析之类的过程.就像个老师检查学生的作文中有

  • java教程之java程序编译运行图解(java程序运行)

    首先我们在桌面,开始->运行->键入cmd 回车,进入windows命令行.进入如图所示的画面: 可知,当前默认目录为C盘Users文件夹下的Administrator文件夹.一般而言,我们习惯改变当前目录.由于windows有磁盘分区,若要跳到其他磁盘,例如E盘,有几种方法: 1.输入命令: pushd 路径(此命令可将当前目录设为所希望的任一个已存在的路径) 2.输入命令: e:  转移到e盘,然后再输入 cd 转移到所希望的已知路径. 如图: 希望在windows命令行下使用javac.

  • 在dos窗口中编译和运行java文件的方法

    配置path环境变量 在学习java时,配置path环境变量主要目的是让windows操作系统可以找到java.exe和javac.exe文件. 所以只要把带有java.exe和javac.exe的文件夹的路径配置到path环境变量中就行了. path环境变量通过;(英文半角分号)分隔不同的路径. JAVA_HOME的主要目的是为了方便用户更改jdk版本,可以在JAVA_HOME中直接更改而不用去path中更改,但是不使用JAVA_HOME,直接在path里去配置路径也没有任何问题. 我的电脑-

  • 手动编译并运行Java项目实现过程解析

    现在Java开发基本上就是IDE调试,如果跨平台打个jar包过去运行一般就可以了,但是有些情况比如需要引入外部依赖的时候,这个时候是不能直接运行的,还需要引入一些外部的参数,并不是简单的javac和java的关系了,下面来详细说一下 一般情况下,在本地都是使用eclipse开发工具进行开发,很多东西基本上就不用我们考虑了,如果我们要将项目放到Linux下运行的话,那么就需要进行转移的操作,当然有Maven.Ant这样的自动化部署工具,简直是太方便了,为了做到更进一步认识的话,我们纯手动的去打包一

  • 修改及反编译可运行Jar包实现过程详解

    将可运行Jar包,反编译成项目,修改代码,再次编译,打包. 需要工具:jd-gui.myeclipse 具体步骤: 1.使用jd-gui打开原始的Jar包,选择File-->Save All Sources,会生成一个zip压缩包 2.解压这个压缩包,生成一个文件夹,可以看到文件夹里所有的class文件变成了java源码文件.(如果最开始直接解压原始的Jar包,那么解压出来的就是class文件,而不是java源文件) 3.打开myeclipse,新建一个普通的Project项目,将解压后的内容拷

  • GCC 编译c程序的方法及过程解析

    目前 Linux 下最常用的 C 语言编译器是 GCC ( GNU Compiler Collection ),它是 GNU 项目中符合 ANSI C 标准的编译系统,能够编译用 C . C++ 和 Object C 等语言编写的程序. GCC 不仅功能非常强大,结构也异常灵活.最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java . Fortran . Pascal . Modula-3 和 Ada 等.开放.自由和灵活是 Linux 的魅力所在,而这一点在 GCC 上的体现

  • Java如何处理延迟任务过程解析

    1.利用延迟队列 延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才能从该延时对列中获取任务否则获取不到-- 应用场景比较多,比如延时1分钟发短信,延时1分钟再次执行等,下面先看看延时队列demo之后再看延时队列在项目中的使用: 简单的延时队列要有三部分:第一实现了Delayed接口的消息体.第二消费消息的消费者.第三存放消息的延时队列,那下面就来看看延时队列demo. 一.消息体 package com.delqueue

  • Windows下pycharm创建Django 项目(虚拟环境)过程解析

    1. 背景 我在 Windows 下的 pycharm 直接创建 全新 Django 项目 会 pip 和其他报错 ,暂时解决不了,另外后续的多个项目只需要一套python 环境, 所以可以 利用 virtualenv 创建一个 虚拟环境,pycharm 创建的 Django 项目 在选择解释器的时候 选择虚拟环境的解释器. 2. virtualenv 安装 https://www.jb51.net/article/170070.htm 在 虚拟环境里面 安装 Django 版本 1.11.24

  • Springboot实现Java邮件任务过程解析

    1.maven引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> 2.application.properties配置发送邮箱 //用户邮箱 spring.mail.username=753029781@qq.com //QQ邮箱开通第三

  • Jackson优雅序列化Java枚举类过程解析

    1. 前言 在Java开发中我们为了避免过多的魔法值,使用枚举类来封装一些静态的状态代码.但是在将这些枚举的意思正确而全面的返回给前端却并不是那么顺利,我们通常会使用Jackson类库序列化对象为JSON,今天就来讲一个关于使用Jackson序列化枚举的通用性技巧. 2. 通用枚举范式 为了便于统一处理和规范统一的风格,建议指定一个统一的抽象接口,例如: /** * The interface Enumerator. */ public interface Enumerator { /** *

  • Django框架安装及项目创建过程解析

    1.安装Django 在命令行模式下使用pip工具来安装Django,pip工具的安装方法见此篇 pip install django 2.确认是否安装成功 在Python交互模式下 import django django.get_version() 3.创建Django项目 在命令行模式下 django-admin.py startproject demo 注意:创建的项目在当前执行命令所在目录下 4.创建APP 在命令行模式下,进入上一步创建的项目目录demo下,里面包括同名子目录demo

  • redis发布订阅Java代码实现过程解析

    前言 Redis除了可以用作缓存数据外,另一个重要用途是它实现了发布订阅(pub/sub)消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 为了实现redis的发布订阅机制,首先要打开redis服务:其次,引入redis需要的jar包,在pom.xml配置文件加入以下代码: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> &

随机推荐