Archief - JAVA: ODBC en JAR export

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

scipicore

Legacy Member
Ik heb een programmaatje in elkaar gestoken dat gebruikt maakt van een Access DB. Nu zou ik dit willen exporten naar een JAR file en de DB apart. Hoe pak ik dit aan?

Ik heb het al kunnen exporten naar één enkele JAR file maar dan kreeg ik volgende error:
Code:
[Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x1fc0 Thread 0x1478 DBC 0x8ff7ff4                                  Jet
Ik weet wel dat ODBC niet ideaal is voor zo'n dingen, maar het programma moet overmorgen af zijn, dusja..

Wolf2000me

Legacy Member
Het is mij niet helemaal duidelijk wat je bedoelt. Wat wil je exporteren? Ik begrijp vooral de combinatie van "iets" exporteren naar zowel een DB en jar file.

Een jar file wordt gebruikt als packaging om bv. in andere jar/war/ear files in het classpath te gaan gebruiken zodat de classes daarin kunnen gebruikt worden.

Als je een jar wil maken van je project doe je dit best met een build tool. Zo'n build tool is bv. Ant of Maven. Voor dit laatste zou ik Maven2 kiezen trouwens, dit is het beste supported voor integrated development tools (IDE) zoals Eclipse of IntelliJ. Gebruik je één, indien ja welke? Indien nee, by all means gebruik één ^^

scipicore

Legacy Member
Wel, ik heb gewoon een projectje met een DB dat ik zou moeten runnen op een andere pc, zonder eclipse of dergelijke. De databank zou dan achteraf nog apart te bezichtigen moeten zijn.

Wolf2000me

Legacy Member
Wat bedoel je met apart te bezichtigen?

Je wil je DB toestanden mee in de jar steken?

Gebruik maven 2 daarvoor en kijk naar de maven assembly plugin.

Eender welk java project met Maven2 aanvatten is (imo) een goed idee trouwens.
De assembly plugin laat je toe van een package te maken (jar/war/ear/...) en daar een aantal zaken bij in te steken.

scipicore

Legacy Member
Nee, de DB moet net apart zijn. Ik heb dus 2 bestanden nodig, een runnable JAR en een acces DB.

Ik heb die Maven2 eens bekeken maar dat lijkt mij veel te ingewikkeld voor wat ik nodig heb...

Best stom dat we op school nooit zo iets gezien hebben, het lijkt mij wel redelijk essentieel dat je de programma's die je maakt ook kan draaien op pc's zonder eclipse.

Wolf2000me

Legacy Member
Ja je kan natuurlijk altijd eender welke compiled class in Java runnen met het java command he. Da's in essentie wat eclipse ook doet. Een class of jar maakt daarbij niet uit. In elk geval is de maven config om een jar te maken echt super basic zenne als enkel uw classes enz eruit moeten komen.

Ik weet niet welke richting je volgt, maar een build tool als Maven zou effectief wel mogen gegeven worden.

Dus, voor de goeie verstaander... Welke dependency heeft jouw programma op de externe DB? Gebruikt je programma een path naar die DB? Specifieer iets beter wat je programma juist zou moeten doen, dan is het misschien duidelijker.

Ik zou zeggen... Zwier die DB in een folder (in eclipse dan) en gebruik Maven om deze te kopiëren naar een bepaalde plaats in de target dir en gebruik daarvoor relatieve paden.

volgens mij heb je dus niet lang genoeg naar Maven gekeken want zoiets doen is echt wel redelijk simpel. Zeker als je een jar wil zal je toch met zoiets moeten afkomen en ik denk als je daarvoor dan Maven hebt gebruikt dat dat wel punten zal waard zijn.
Trouwens, overal waar ik kom gebruikt men Maven2 als build tool hoor.

scipicore

Legacy Member
Ok, ik heb nu, na lang prutsen, een runnable jar kunnen maken met gebruik van Maven.

Nu zit ik enkel nog met het ODBC probleem; namelijk, bij het lezen/schrijven van de DB krijg ik volgende error:
Code:
[Microsoft][ODBC Manager] Data source name not found and no default driver specified

Ik heb al gelezen op internet en vind vanalles over User DSN's en System DSN's maar ik vind nergens concreet wat ik moet doen.

Misschien is dit ondertussen al eerder een vraag voor de OS sectie?

*edit*
Als ik het programma run in eclipse krijg ik volgende error:
Code:
[Microsoft][ODBC Microsoft Access Driver]General error Unable to open registry key Temporary (volatile) Ace DSN for process 0x1fc0 Thread 0x1478 DBC 0x8ff7ff4                                  Jet

*edit2*
voorgaande edit is overbodig, kleine fout in mijn connectiestring

NeverwinterX

Legacy Member
Toon het stuk code waarmee je connectie maakt met de database en de database driver enzo
Beschrijf ook hoe je het nu gemaakt hebt:
een jar met de code en daarnaast in dezelfde map de database file?

Met eclipse kan je ook een jar maken: rechterklik op het project - export - java jar file - next - en dan instellen zoals je wilt (niet meteen finish klikken, maar kijk met next naar de andere settings, stel ook de main class tegoei in).

Werkte het trouwens voordat je begon te proberen te exporteren naar jar of zitten er mogelijk nog andere fouten in?

scipicore

Legacy Member
NeverwinterX zei:
een jar met de code en daarnaast in dezelfde map de database file?
De DB staat in een aparte map.

NeverwinterX zei:
Werkte het trouwens voordat je begon te proberen te exporteren naar jar of zitten er mogelijk nog andere fouten in?
Ja, dat werkt nog altijd perfect, het is enkel het geëxporteerde programma dat niet werkt.

Dit is de code van de connectie:
Code:
public class Connectie
{
	// JDBC Driver
	private static final String JDBC_DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";

	// JDBC Database URL
	private static final String DATABASE_URL ="jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=.\\src\\main\\java\\db\\Database.accdb";

	// De eigenlijke connectie
	private Connection connection;

	/**
	 * Maakt een connectie met de database aan.
	 */
	public Connectie() 
	{
		try 
		{
			// Laadt database driver klasse
			Class.forName(JDBC_DRIVER);

			// Connectie maken met database
			connection = DriverManager.getConnection(DATABASE_URL);

		} 
		// SQL problemen opvangen
		catch (SQLException sqlException) 
		{
			JOptionPane.showMessageDialog(null, sqlException.getMessage(),
					"Database Error", JOptionPane.ERROR_MESSAGE);

			System.exit(1);
		}
		// database problemen opvangen 
		catch (ClassNotFoundException classNotFound)
		{
			JOptionPane.showMessageDialog(null, classNotFound.getMessage(),
					"Driver Not Found", JOptionPane.ERROR_MESSAGE);

			System.exit(1);
		}
	}

	/**
	 * Sluit de connectie met de database.
	 */
	public void closeConnection() 
	{
		try 
		{
			connection.close();
		}

		// vangt exceptions op bij het sluiten van de db
		catch (SQLException sqlException)
		{
			JOptionPane.showMessageDialog(null, sqlException.getMessage(),
					"Database Error", JOptionPane.ERROR_MESSAGE);

			System.exit(1);
		}
	}
}

Zou het kunnen liggen aan het feit dat het voor mijn JAR file een andere locatie is? classes/db/db.accdb ipv src/main/java/db/db.accdb?

De link die je gaf, Wolf2000me, heb ik geprobeerd maar helaas.

Wolf2000me

Legacy Member
Code:
DBQ=.\\src\\main\\java\\db\\Database.accdb";

Als je via de jar runt moet op deze manier je "Database.accdb" bestand in de jar op die locatie staan. Maar omdat je wil dat de dit bestand op een externe locatie staat zal je het pad daar naartoe moeten laten wijzen. Dit doe je liefst niet hardcoded (dus vol pad zoals "C:\blabla") maar relatief. Bv. "../blabla" of iets in die trend. Maar aan de andere kant kan je wel eens proberen van dit eerst effectief wel hardcoded te schrijven. Als dat werkt dan kan je overgaan tot een relatief pad.
Je pad via "Properties" inlezen is meestal the way to go, dan kan je dit gemakkelijk wijzigen.

scipicore zei:
Zou het kunnen liggen aan het feit dat het voor mijn JAR file een andere locatie is? classes/db/db.accdb ipv src/main/java/db/db.accdb?

Wanneer je database bestand wel in de jar zou zitten, in de resources folder bv. en zich dus in het classpath bevindt, dan maakt het niet uit. Anders uiteraard wel.

edit:

Hoe gemakkelijk kan je testen? Soms is het handig van een testclass the schrijven die je heel vaak kan runnen. Moest je nu tijd over hebben zou ik zeggen van eens naar JUnit te kijken. Je declareert dan je Connectie class in een testmethode en je instantieert er een object mee.

scipicore

Legacy Member
Databank verplaatsen naar D:\db.accdb werkt niet, dus ik vermoed dat het niet aan de code van het programma ligt. (Dit werkt ook weer in eclipse zelf, in jar niet)

Voor testen heb ik geen tijd meer, het moet deze avond nog af zijn. Gelukkig is het geen opdracht voor school...Ik denk dat ik morgen gewoonweg op de laptop waar ik het programma moet runnen eclipse ga installeren.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan