在.Net中使用Java代码?
前言
你没有看错,我确实在.Net6的项目中在编写java,我都using java了,算不算在写java那?
using com.microsoft.sqlserver.jdbc;
using java.sql;
并且编辑器还带提示的功能

这一切都是借助IKVM来实现的,或许有些人还听说过使用IKVM的CLI命令来转换jar包,比如使用Bing搜索:ikvm转换jar包为dll ,但是这个过程我是没有经历的,现在的使用方法更省事了
IKVM是什么?
从GitHub摘抄说明:IKVM 是 Microsoft .NET 平台的 Java 实现。它可用于快速轻松地:
- 在 .NET Framework 或 .NET Core 上执行已编译的 Java 代码(字节码)
- 将字节码转换为 .NET 程序集,以在 .NET 项目中直接访问其 API
无需将源代码移植到 .NET 即可完成这些任务。
GitHub地址:https://github.com/ikvmnet/ikvm
插播资讯
这里插播一个看到的资讯,没想到吧,中间居然夹带私货

都夹带私货了,那发个福利吧,地址放这里吧:http://www.loongnix.cn/zh/api/dotnet/
用法
直接引用jar包
例如我们有一个netjar.jar包想将其引入到项目中,那么我们可以在项目中创建一个jar的文件号,然后将netjar.jar文件放进去,然后修改项目文件
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="IKVM" Version="8.2.1" />
</ItemGroup>
<ItemGroup>
<IkvmReference Include="jar/netjar.jar" >
<AssemblyName>netjar</AssemblyName>
<AssemblyVersion>1.0.0.4</AssemblyVersion>
</IkvmReference>
</ItemGroup>
</Project>
在 .csproj 中添加 IkvmReference , 再添加 Include 为 jar/netjar.jar,并指定 AssemblyName 编译后的 就是 netjar.dll ,AssemblyVersion 必须是 1.0.0.0 这种 4位数的版本号会给dll加上版本信息
IkvmReference的说明:https://github.com/ikvmnet/ikvm#attributes-and-elements
Maven源引用
推荐一个maven源给跟我一样不会java的.Net开发者:https://mvnrepository.com/
项目中可以使用阿里云的源:https://maven.aliyun.com/nexus/content/groups/public/
对比直接引用的方法,我们需要多安装一个IKVM.Maven.Sdk的Nuget包,默认是有一个Maven源的,然后我们只需要修改.csproj项目文件进行配置MavenReference即可
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="IKVM" Version="8.7.1"/>
<PackageReference Include="IKVM.Maven.Sdk" Version="1.6.1"/>
</ItemGroup>
<ItemGroup>
<MavenReference Include="mssql-jdbc">
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre8</version>
</MavenReference>
<!-- <MavenReference Include="com.microsoft.sqlserver:mssql-jdbc" Version="12.4.2.jre8" />-->
</ItemGroup>
</Project>
使用说明:https://github.com/ikvmnet/ikvm-maven#readme
其中MavenReference内容可以参考上面的maven源搜索出来的内容,比如:https://mvnrepository.com/artifact/com.microsoft.sqlserver/mssql-jdbc/12.4.1.jre8

设置自定义源
默认已经包含了源,也可以通过修改项目文件来设置自定义源,这里我设置了阿里云的源:https://maven.aliyun.com/nexus/content/groups/public/
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<MavenDefaultRepositories Condition="'$(MavenDefaultRepositories)' == '' ">central=https://maven.aliyun.com/nexus/content/groups/public/</MavenDefaultRepositories>
<MavenRepositories Condition=" '$(MavenRepositories)' == '' ">$(MavenDefaultRepositories);$(MavenAdditionalRepositories)</MavenRepositories>
</PropertyGroup>
操作示例
使用hutool序列化对象
下面演示调用java序列化的jar包来序列化(仅为了演示效果),新建项目(此处我使用的是.Net6框架的项目),引用nuget包
<ItemGroup>
<PackageReference Include="IKVM" Version="8.6.4" />
<PackageReference Include="IKVM.Maven.Sdk" Version="1.5.5" />
</ItemGroup>
引用mvaen的包,修改项目文件如下
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<MavenDefaultRepositories Condition="'$(MavenDefaultRepositories)' == '' ">central=https://maven.aliyun.com/nexus/content/groups/public/</MavenDefaultRepositories>
<MavenRepositories Condition=" '$(MavenRepositories)' == '' ">$(MavenDefaultRepositories);$(MavenAdditionalRepositories)</MavenRepositories>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="IKVM" Version="8.6.4" />
<PackageReference Include="IKVM.Maven.Sdk" Version="1.5.5" />
</ItemGroup>
<ItemGroup>
<MavenReference Include="cn.hutool">
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.6.6</version>
</MavenReference>
</ItemGroup>
</Project>
序列化对象
using cn.hutool.json;
var userInfo = new UserInfo { UserName = "admin", Password = "123456" };
var result = JSONUtil.toJsonStr(userInfo);
Console.WriteLine(result);
public class UserInfo
{
/// <summary>
/// 用户名
/// </summary>
public string UserName;
/// <summary>
/// 密码
/// </summary>
public string Password;
}
使用jdbc连接sqlserver2008
该示例是当时连接sqlserver2008一直报错(数据库版本太低了),java组那边说他们连接不报错,所以想操作试试搞的
新建一个.Net6的控制台项目,然后引用nuget包(IKVM.Maven.Sdk是使用maven源用到的,直接引入jar包可以不安装)
<ItemGroup>
<PackageReference Include="IKVM" Version="8.7.1"/>
<PackageReference Include="IKVM.Maven.Sdk" Version="1.6.1"/>
</ItemGroup>
这个时候就需要找一个连接数据库的包,经过搜索后可以使用mssql-jdbc(也可以采用直接下载jar包放到项目目录内的方法,不使用maven),那么可以引入一下
<ItemGroup>
<MavenReference Include="mssql-jdbc">
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.4.2.jre8</version>
</MavenReference>
<!--简化写法-->
<!--<MavenReference Include="com.microsoft.sqlserver:mssql-jdbc" Version="12.4.2.jre8" />-->
</ItemGroup>
这时候如果项目生成不报错了,那么说明包等下载好、引用好了,开始编写代码,代码虽然简单,但是还是花费了一番功夫的
try
{
var url = "jdbc:sqlserver://192.168.1.50:1433;DatabaseName=manage;Encrypt=false";
var userName = "sa";
var pwd = "admin123";
DriverManager.registerDriver(new SQLServerDriver());
var connection = DriverManager.getConnection(url, userName, pwd);
var stmt = connection.createStatement();
var rs = stmt.executeQuery("select @@version");
while (rs.next())
{
Console.WriteLine(rs.getString(1));
}
Console.WriteLine("conn success");
}
catch (Exception ex)
{
Console.WriteLine($"message:{ex.Message} stackTrace:{ex.StackTrace}");
}
经过我的瞎蒙以及查阅资料终于写出来了上面查询数据库版本号的代码,然后启动项目查看输出

测试一下容器部署,选中项目右键新建dockerfile文件如下(默认生成的)
FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["JavaConsoleApp/JavaConsoleApp.csproj", "JavaConsoleApp/"]
RUN dotnet restore "JavaConsoleApp/JavaConsoleApp.csproj"
COPY . .
WORKDIR "/src/JavaConsoleApp"
RUN dotnet build "JavaConsoleApp.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "JavaConsoleApp.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "JavaConsoleApp.dll"]
虽有警告,但是可以正常连接

这里不得不说,他这组件要求还怪宽松,看过我上个文章的人就知道,我使用.Net组件连接sqlserver2008(甲方的数据库,版本低还不能升级)还需要再dockefile中配置其它。
参考资料
maven文档:https://github.com/ikvmnet/ikvm-maven
java操作数据库:https://blog.csdn.net/qq_37917691/article/details/108262286
在.Net中使用Java代码?的更多相关文章
- Myeclipse中把java代码导成UML类图
Myeclipse中把java代码导成UML类图 1.右键点击项目名称,选择New-------àUML2 Model 2.给类图命名 3.导成类图 1)如果要把整个项目导成类图,则把整个项目拖到类图 ...
- jsp页面中的java代码
jsp页面中的java代码 1.jsp表达式 <%= ....%> 只能放置一个变量常量 2. jsp小脚本 <% .... %> java语句,可以插入一些语句 3. ...
- JSP中嵌入java代码方式以及指令
JSP中嵌入java代码的三种方式: (1)声明变量或方法 : <%! 声明; %> :慎重使用,因为此方法定义的是全局变量 (2)java片段(scriptlet): <% j ...
- android中在java代码中设置Button按钮的背景颜色
android中在java代码中设置Button按钮的背景颜色 1.设置背景图片,图片来源于drawable: flightInfoPanel.setBackgroundDrawable(getRes ...
- MyEclipse中阿里JAVA代码规范插件(P3C)的安装及使用
JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...
- eclipse中添加Java代码注释模板
eclipse中添加Java代码注释模板 1.Window->Preference->Java->Code Style->Code Template,进入注释编辑界面 2.文件 ...
- EL和 JSTL? 在JSP中简化 java代码的写法!
一.servlet部分 package com.aaa.servlet; import com.aaa.dao.IStudentDAO; import com.aaa.dao.Impl.Student ...
- IDEA中阿里JAVA代码规范插件(P3C)的安装及使用
JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...
- 在Eclipse中运行JAVA代码远程操作HBase的示例
在Eclipse中运行JAVA代码远程操作HBase的示例 分类: 大数据 2014-03-04 13:47 3762人阅读 评论(2) 收藏 举报 下面是一个在Windows的Eclipse中通过J ...
- JSP中的Java代码和内置对象
一.JSP中的Java代码 (一)JSP页面中有三种方式嵌入java代码: 1.java的表达式 格式:<%= java表达式 %> 2.java的语句 格式:<% java语句&g ...
随机推荐
- 【DS】【AtCoder】Pakencamp 2022 Day2 H
2023.6.30 Problem Link 有 \(n\) 个帮派在打架,每个帮派有一个大小 \(a_i\),每相邻两个帮派有一个仇恨度 \(b_i\).现在有 \(Q\) 次单点修改 \(a_i\ ...
- React中生命周期的讲解
什么是生命周期? 从出生到成长,最后到死亡,这个过程的时间可以理解为生命周期. React中的组件也是这么一个过程. React的生命周期分为三个阶段:挂载期(也叫实例化期).更新期(也叫存在期).卸 ...
- linux服务器cup100%问题排查
一.出现问题在发现公司门禁服务无法开门的第一时间,去线上服务器上查看了一下进程的运行情况,具体运行如下: 第一次在查看的时候发现并没有我需要的服务entranceguard进程(图片是后续截图的) 二 ...
- YiGo学习(一)YiGo介绍
YiGo是一种开发语言,是一种面向业务人员进行管理信息系统开发的特定领域语言,属于第五代计算机语言.它可以在图形化界面上进行选择.拖拽等动作进行管理业务建模,通过建立对系统需求的描述模型由计算机自动生 ...
- Unity2019使用Android Studio 4出安卓包
前言 在我所经历的项目组中有这几种方法来生成APK 直接在Unity生成APK,可以接入SDK 使用Unity导出Android Studio工程手动生成APK 使用Unity导出Android St ...
- TienChin 渠道管理-添加渠道
在我们平时新建一个全新的 Java 类,这个类需要存放的包不存在,可以使用如下的方式进行创建: 含义就是说,将 ChannelVO 这个类放在 vo 这个包当中,如果存在则不创建,存在就将新建的类放入 ...
- 基于知识图谱的《红楼梦》人物关系可视化及问答系统(含码源):命名实体识别、关系识别、LTP简单教学
基于知识图谱的<红楼梦>人物关系可视化及问答系统(含码源):命名实体识别.关系识别.LTP简单教学 文件树: app.py是整个系统的主入口 templates文件夹是HTML的页面 |- ...
- 【八】强化学习之DDPG---PaddlePaddlle【PARL】框架{飞桨}
相关文章: [一]飞桨paddle[GPU.CPU]安装以及环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简 ...
- 8.1 Windows驱动开发:内核文件读写系列函数
在应用层下的文件操作只需要调用微软应用层下的API函数及C库标准函数即可,而如果在内核中读写文件则应用层的API显然是无法被使用的,内核层需要使用内核专有API,某些应用层下的API只需要增加Zw开头 ...
- ElasticSearch7.3学习(一)----采用restful风格 基本的增删查改语句
1 .新建图书索引 首先建立图书索引 book 语法:put /index PUT /book 结果 2.新增图书 :新增文档 语法:PUT /index/type/id PUT /book/_doc ...