第一章 JAR包基础与创建
1.1 JAR包结构解析
JAR(Java Archive)文件本质上是基于ZIP格式的打包文件,包含:
- 编译后的.class文件
- 资源文件(如配置文件、图片等)
- META-INF/MANIFEST.MF清单文件
// 示例项目结构
src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── App.java
│ └── resources/
│ └── config.properties
1.2 使用Maven打包
pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
</project>
通过mvn package命令生成可执行JAR包,包含主类配置信息。
第二章 JAR包运行方式
2.1 基础运行命令
# 运行普通JAR包(指定主类) java -cp my-app.jar com.example.App
# 运行可执行JAR(包含Main-Class) java -jar my-app.jar
# 带参数运行 java -jar my-app.jar arg1 arg2
2.2 运行时配置
# 内存配置 java -Xms256m -Xmx1024m -jar my-app.jar
# 系统属性设置 java -Dconfig.path=/etc/myapp/config.properties -jar my-app.jar
# 调试模式 java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar my-app.jar
第三章 日志系统集成
3.1 Log4j2配置示例
log4j2.xml
xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
<File name="File" fileName="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>
<RollingFile name="RollingFile" fileName="logs/app.log"
filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<DefaultRolloverStrategy max="10"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Console"/>
<AppenderRef ref="RollingFile"/>
</Root>
<Logger name="com.example" level="debug" additivity="false">
<AppenderRef ref="File"/>
</Logger>
</Loggers>
</Configuration>
已完成
3.2 SLF4J+Logback配置
logback.xml
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/archived/application-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
已完成
第四章 高级运行管理
4.1 Spring Boot JAR运行
# 标准运行 java -jar spring-boot-app.jar
# 指定Profile java -Dspring.profiles.active=prod -jar spring-boot-app.jar
# 外部配置覆盖 java -jar spring-boot-app.jar --server.port=8081
# 调试模式 java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=5005,suspend=n -jar spring-boot-app.jar
4.2 服务化运行脚本
run.sh
#!/bin/bash
JAR_NAME="my-app.jar"
JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
LOG_DIR="./logs"
PID_FILE="$LOG_DIR/app.pid"
mkdir -p $LOG_DIR
start() {
if [ -f $PID_FILE ]; then
echo "Application is already running"
exit 1
fi
nohup java $JAVA_OPTS -jar $JAR_NAME >> $LOG_DIR/console.log 2>&1 &
echo $! > $PID_FILE
echo "Application started with PID $(cat $PID_FILE)"
}
stop() {
if [ ! -f $PID_FILE ]; then
echo "Application is not running"
exit 1
fi
kill $(cat $PID_FILE)
rm $PID_FILE
echo "Application stopped"
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
已完成
第五章 日志分析与监控
5.1 日志查询命令
# 实时查看日志 tail -f logs/app.log
# 查找错误日志 grep "ERROR" logs/app.log
# 按时间范围查询 sed -n '/2023-05-01 10:00/,/2023-05-01 11:00/p' logs/app.log
# 统计错误次数 grep -c "ERROR" logs/app.log
5.2 ELK日志收集配置
logstash.conf
input {
file {
path => "/path/to/your/logs/app.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{DATA:thread}\] %{LOGLEVEL:loglevel} %{DATA:logger} - %{GREEDYDATA:message}" }
}
date {
match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
target => "@timestamp"
}
}
output {
elasticsearch {
hosts => ["localhost:9200"]
index => "app-logs-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
已完成
第六章 实战案例
6.1 多模块项目打包
pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>core</module>
<module>web</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.example.MainApp</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
已完成
6.2 自定义日志处理器
CustomLogger.java
org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class CustomLogger {
private static final Logger logger = LoggerFactory.getLogger(CustomLogger.class);
public void processBusiness() {
logger.trace("Detailed trace information");
logger.debug("Debug level information");
logger.info("Business process started");
try {
// 业务逻辑
logger.info("Processing item: {}", 123);
} catch (Exception e) {
logger.error("Error processing business", e);
throw new RuntimeException(e);
}
logger.info("Business process completed");
}
public static void main(String[] args) {
CustomLogger app = new CustomLogger();
app.processBusiness();
}
}