这里总结一些常用的技巧。
离线仓库
适用于一些离线使用场景,在某台在线机器上将仓库同步到远端,同时通过如下命令清理掉 _remote.repositories
文件,否则 Maven 会先尝试从远端获取包。
find -type f -name '_remote.repositories' -exec rm {} \;
修改默认的 Maven 配置文件,一般是 ~/.m2/settings.xml
文件。
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>/opt/third/maven</localRepository>
<offline>true</offline>
<mirrors>
<mirror>
<id>central-proxy</id>
<name>Local proxy of central repo</name>
<url>file:///opt/third/maven</url>
<mirrorOf>*</mirrorOf>
</mirror>
</mirrors>
</settings>
离线执行
可以通过如下 Maven 命令编译 Jar 包。
----- 通过-pl+目录指定子模块编译
mvn -U -pl hive -am clean package
----- 或者通过groupId:artifactId指定
mvn -U -pl org.example:hive -am clean package
在编译完成之后可以通过如下命令执行,这里使用的是目录方式指定子模块,同样可以切换到 groupId:artifactId
的方式。
mvn exec:java -pl hive -Dexec.mainClass="com.foobar.BasicClient"
如果主函数需要指定参数,可以在命令行中添加如下内容 -Dexec.args="arg0 arg1 arg2"
即可。
通过Java命令运行
当尝试通过 java -cp hive/target/hive-1.0.0.jar com.foobar.BasicClient
命令直接运行时可能会出现 java.lang.NoClassDefFoundError
类似的错误,这主要是依赖包不存在导致的,有如下两种解决方式。
将依赖包复制到 lib
目录下,并在执行的时候指定 Jar 包,修改 pom.xml
文件增加如下内容。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后通过如下命令执行。
java -cp "/svr/foobar/code/hive/target/lib/*:hive/target/hive-1.0.0.jar" com.foobar.BasicClient
或者,将依赖 Jar 包打包到输出包中,同样修改 pom.xml
增加如下内容。
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
执行的时候直接指定依赖包即可。
java -cp hive/target/hive-1.0.0-with-dependencies.jar com.foobar.BasicClient
日志级别
这里通过 logback
输出,在 pom.xm
增加如下配置,其中 logback-classic
会自动引入 logback-core
依赖。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.13.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.9</version>
</dependency>
对应的配置文件保存在 resources/logback.xml
目录下,内容为。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<target>System.out</target>
<encoder>
<pattern>[%date][%level][%logger.%file:%line][%thread]%msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<logger name="org.apache.hadoop" level="INFO"/>
<logger name="com.foobar" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
如果使用了 SpringBoot 架构,那么就同时增加 application.properties
文件,内容为。
logging.config=classpath:logback.xml
当打包后没有生效时,可以通过 unzip
解压 jar
包,或者通过 jar ftv xxx.jar
查看。
其它
版本切换
可以直接通过 which java
查看,如果是通过 alternatives
管理,一般以符号链接方式指向 /etc/alternatives/java
文件,此时可以通过如下命令进行更新。
update-alternatives --config java