总体流程
在服务器上部署maven项目一般不需要将整个项目文件都上传至服务器,大致流程如下:
1、使用 Maven 构建项目。在项目根目录下执行以下命令,对项目进行打包:
mvn clean package
2、打包生成的target文件夹上传至服务器。
在 Maven 项目中,target
目录是构建过程生成的临时目录,其中包含了编译后的类文件、资源文件和构建产物(如 JAR、WAR 或 EAR 文件)等。这些构建产物是最终部署到服务器上并运行的文件。
上传整个项目可能会包含大量的源代码、配置文件和其他开发过程中的临时文件,而这些文件在部署和运行阶段并不需要。因此,为了减少上传和部署的大小和时间,通常只需要将构建产物( target
目录下)上传到服务器即可。
3、根据部署方式和服务器配置,启动项目:
-
对于独立的可执行 JAR 文件,使用
java -jar
命令运行target目录下的 JAR 文件。 -
对于单个类,可以执行以下命令:
# 进入类文件夹
cd target/classes
# 执行类
java com.example.MainClass
实例
以alink java机器学习项目作为待部署的目标项目,将其部署至服务器并运行。以下为详细过程记录。
一、maven构建alink机器学习java项目
项目构建过程不再赘述,参考官方的构建过程即可:使用 Maven 快速构建 Alink Java 项目
其中最重要的部分就是pom.xml的配置,maven会依据这个文件为项目配置依赖项。在POM文件中设置好Alink相关的dependency后,就可以在项目中使用Alink库函数。之后将项目依赖一起上传至服务器,也是代码在服务器上正常运行的重要条件。
二、maven项目上传至服务器
1、构建项目:使用maven对项目进行打包,可以看到在项目的根目录下生成了一个target目录,只需将这个目录同步至服务器。
mvn clean
mvn package
2、连接到服务器:推荐使用Idea自带的服务器连接,如下图,在tool
->deployment
->configuration
配置服务器连接、项目同步目录等信息。点击左上角"+"号,新建一个安全文件传输协议SFTP。配置以下信息:
-
Host 远程主机,可以是在本地hosts配置过映射的域名,也可以直接填写IP
-
Username 远程SSH登录用户名
-
Password 远程SSH登录用户对应密码
-
Root Path 根路径,是指需要进行远程工作的根位置。比如我们要实现本地快速上传jar包到Server服务器,我们先在远程服务器创建一个文件夹
为本地和远程文件夹建立映射关系。点击Mappings选项卡。
-
Local Path:本地路径,需要映射的本地路径,我们选择当前文件夹下的target文件夹,这是打包后jar包所在的文件夹,maven打包后自动生成
-
Deployment Path:远程部署文件夹,就是需要把本地路径的文件对应上传到远程的某个文件夹,这里我们设置为"\"即可,即刚才所设置的根路径Root Path\
也可使用SSH等工具连接到目标服务器。

3、上传项目文件:将构建生成的部署文件上传到服务器上的目标位置。选择tool
->deployment
->browse remote host
,在新出现的remote host
窗口右键,选择upload here
。
4、服务器环境:确保你的服务器上安装了适当版本的Java运行时环境(JRE)或Java开发工具包(JDK)。
参考:IDEA连接远程服务器
三、服务器运行java代码
1、上传至服务器后,可以看到这样的目录结构:

ssh username@hostip
使用cd
命令进入项目上传的根目录。检查java环境:
java -version
javac -version
3、使用maven将项目部署为一个可执行的构建产物后,项目的依赖项通常会被打包到构建产物中,并与构建产物一起部署到服务器上。在部署后,项目的依赖路径将包含在构建产物的类路径中。因此可以使用这样的命令运行代码:
java org.example.KMeansExample
4、**error:**A JNI error has occurred, please check your installation and try again
如图,当我执行一个里面未导入任何依赖的类时,程序正常执行并打印出”hello world“;但是当我运行另一个import了部分依赖的类时却报出JNI错误。

分析(记录用,可跳过至解决部分):“JNI error” 错误通常意味着 Java 虚拟机(JVM)无法加载或使用本地库(Native Library)。
- 由于代码在本地运行成功;我本以为Maven package 会将项目的源代码、资源文件以及所需的依赖库一起打包到最终的构建产物中。于是我想到可能是未指定依赖路径导致。
尝试使用命令:
java -cp ../AlinkMavenExample-1.0-SNAPSHOT.jar org.example.KMeansExample
- 由于在JNI错误后又输出了Exception in thread “main” java.lang.NoClassDefFoundError,检查.jar包,发现其中没有pom.xml文件中配置的依赖。
尝试手动下载maven而不是使用idea自带的,maven下载配置过程
5、JNI error解决:这样做之后打包生成的jar文件中还是没有依赖。然后我看到这样一句话:
Maven在打包项目时默认是不包含所需的依赖的,这样就导致项目在Main方法里可运行但是打成jar包时就缺少依赖。
我一直以为maven打包会自动导入依赖,试着解决这个问题:
IDEA中找不到maven插件Plugin not found 解决
在配置文件pom.xml中添加以下内容:
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.example.KMeansExample</mainClass>//这里是你的包含mian方法的类
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>
</transformers>
<relocations>
<relocation>
<pattern>org.codehaus.plexus.util</pattern>
<shadedPattern>org.shaded.plexus.util</shadedPattern>
<excludes>
<exclude>org.codehaus.plexus.util.xml.Xpp3Dom</exclude>
<exclude>org.codehaus.plexus.util.xml.pull.*</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
在这之后会在你项目的target目录下生成两个.jar文件
一:original-项目名-1.0-SNAPSHOT.jar
这个jar包还是没有依赖的
二:项目名-1.0-SNAPSHOT.jar
这个是有依赖的
6、将target下的文件重新同步服务器后,再次执行命令,可以得到如下输出,代码运行成功!!撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。
java -cp ../AlinkMavenExample-1.0-SNAPSHOT.jar org.example.KMeansExample

其他
一、javac与java
1、.java文件编译:
- java不能直接运行.java文件,需要先对.java文件进行编译。javac编译java文件:
# 编译
javac -cp ../lib com\example\MainClass.java
- maven打包,会在项目根目录下的
target\classes
下生成类的编译文件(.class):
mvn clean package
2、java执行.class命令
可以使用以下命令执行编译后的 Java 类文件(arg1 arg2为参数)。如果Java类位于包(package)中,需要在执行时包含完整的包名路径。
// libpath项目的依赖路径
cd alink_java\target\classes
java -cp libpath com.example.MainClass
二、maven编译(compile)与打包(package)的区别:
1、编译阶段的目标是将源代码编译成类文件,而不会生成最终的可执行文件或部署包。在 Maven 的编译阶段,Maven 会编译项目的源代码(通常位于 src/main/java
目录下)并生成编译后的类文件。编译阶段会检查源代码的语法错误,并将源代码编译成可执行的 Java 字节码文件。
2、打包阶段的目标是生成最终的构建产物,它会生成一个 JAR 文件,用于 Java 应用程序的分发和执行。而打包阶段用于将编译后的类文件和其他资源文件打包成可执行的构建产物。