在.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 ...
随机推荐
- 【VictoriaMetrics源码阅读】: vm中对map的优化
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu github 公众号:一本正经的瞎扯 具体代码请看:https://github.com/ahf ...
- 【K哥爬虫普法】大众点评VS百度地图,论“数据权属”对爬虫开发的罪与罚!
我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识,知 ...
- 从源码中解析fabric区块数据结构(一)
从源码中解析fabric区块数据结构(一) 前言 最近打算基于fabric-sdk-go实现hyperledger fabric浏览器,其中最重要的一步就是解析fabric的上链区块.虽说fabric ...
- PaddleNLP基于ERNIR3.0文本分类以CAIL2018-SMALL数据集罪名预测任务为例【多标签】
相关项目链接: Paddlenlp之UIE模型实战实体抽取任务[打车数据.快递单] Paddlenlp之UIE分类模型[以情感倾向分析新闻分类为例]含智能标注方案) 应用实践:分类模型大集成者[Pad ...
- win10下MySQL安装教程(MySql-8.0.26超级详细)
一.下载安装包: 官网链接:MySQL :: Developer Zone 依次点击步骤如下: 二.MySQL文件配置 解压安装包: 解压后的目录并没有的my.ini文件,没关系可以自行创建在安装根目 ...
- 【算法】【动态规划】动规dp解决不同路径两道经典OJ笔试题【力扣62-力扣63】超详细的动态规划入门详解,掌握动态规划的解题方法
[算法][动态规划]动规dp解决不同路径两道经典OJ笔试题[力扣62-力扣63]超详细的动态规划入门详解,掌握动态规划的解题方法 作者: @小小Programmer 这是我的主页:@小小Program ...
- Spring Cloud Config核心功能和原理解析
配置管理的前世今生 随着技术的发展,配置项管理变得越来越简单,尽管如今它只限于管理业务属性或者配置初始化参数等等,但是当年它可肩负着 Spring IOC 的光荣使命,风光无限. 想当年刚入行的时候还 ...
- 思维分析逻辑 5 DAY
目录 如何分析 结构分析 对比分析 时间序列 相关性分析 机器学习 报告撰写 报告撰写三原则 标准化报告的组成 AB测试 AB测试流程 AB测试注意事项 如何分析 结构分析 对比分析 对比分析:所有的 ...
- 2023牛客暑期多校训练营6 ABCEG
比赛链接 A 题解 方法一 知识点:并查集,树形dp,背包dp. 因为需要路径中的最大值,因此考虑按边权从小到大加入图中,保证通过这条边产生贡献的点对已经全部出现. 在加边的同时进行树上背包,答案存在 ...
- Ubuntu22.04 将EFI启动分区迁移到另一块硬盘
机器上有两块硬盘, 一块已经安装了Win10, 另一块新装Ubuntu22.04, 在新硬盘上划分分区的时候, 有分出256M给 BOOT EFI, 但是安装的时候没注意, 启动分区不知道怎的跑到 W ...